InnoDB

Ich hab mir ehrlich gesagt noch nie Gedanken über die Tabellenformate von MySQL gemacht. MyISAM klingt doch sehr gut, als verbesserte Version der ISAM-Engine. Funktioniert ja auch (annähernd) perfekt. Wenn mal was kaputt geht, kann man es im Normalfall mit REPAIR TABLE oder wenn’s sein muss mit myisamcheck wieder reparieren.

Heute habe ich mir das erste mal über InnoDB Gedanken gemacht. Ein Kunde hatte Probleme mit einigen Tabellen, welche im PHPMyAdmin als in use gekennzeichnet waren. Kein Problem: Einfach reparieren.
Also alle markiert und reparieren ausgewählt. Aber WTF! Can’t open file: ‚table.InnoDB‘.
Mhm, table.InnoDB, noch nie gesehen, aber mal nachschauen. Im data-folder gab es dann nur eine table.frm. Das schaut auf den ersten Blick nach Datenverlust aus. So ein Zufall, dass es gerade alle InnoDB-Tables dieses Kunden erwischt hat. Nunja, dann hab ich mich erstmal über InnoDB schlau gemacht.

InnoDB ist offenbar sehr gut für riesengroße Datenbanken geeignet. Laut mysql.com verwenden einige Firmen InnoDB für riesige Datenbestände mit mehr als einem Terabyte. Fast unglaublich.
Der Nachteil an dem ganzen ist, dass sich alle Tabellen von allen Datenbanken (ja, alle DBs im selben mysqld) eine einzige physische Datendatei (das shared tablespace) und eine Logdatei teilen (ibdata1 und ib_logfile0/ib_logfile1). Also wenn da mal eine Tabelle verschwunden ist, keine Ahnung wie man die wiederherstellen kann. Auch google hat da nicht viel geholfen.
Trauriges Ergebnis: Die Tabellen sind leider verloren. Kann man nix machen.

Es gibt noch die Möglichkeit, die Daten von InnoDB-Tabellen in eigene Files im Datenbankverzeichnis zu speichern, wobei für jede Tabelle neben der .frm Datei auch eine .ibd angelegt wird. Dafür muss in der my.cnf innodb_file_per_table im [mysqld]-Bereich eingetragen werden. Allerdings reicht es nicht diese allein zu sichern, da das interne data dictionary und das undo log weiterhin im shared tablespace abgelegt wird.
Außerdem kann man InnoDB-Tabellen nicht einfach zwischen Datenbankverzeichnissen umherschieben, da die Daten im shared tablespace mit dem Datenbankname verknüpft ist. Stattdessen kann man aber einfach mit RENAME TABLE die Datenbankzugehörigkeit ändern.

Die wohl einzige Möglichkeit eine InnoDB-Tabelle auf einen anderen mysql-Server zu kriegen ist ein SQL-Dump.

Um ein Backup zu erstellen:

mysqldump -h<hostname> -u<username> -p <datenbankname> [table] > dump.sql

Achtung auf das Space hinter -p. In der Datei dump.sql liegt dann die gesamte Tabelle (oder wenn man keine Tabelle zum dumpen angegeben hat die gesamte Datenbank) als SQL-Statements, welche mit folgendem Befehl wieder importiert werden kann:

mysql -h<host> -u<username> -p <datenbank> < dump.sql

Flattr this!


One Comment

So, what do you think ?

You must be logged in to post a comment.