Ein Grund, warum ich bisher InnoDB skeptisch gegenüberstand, war neben der drei bis fünfach höheren Datenmenge von InnoDB-Tabellen gegenüber myIsam-Tabellen, das “Problem”, dass bei InnoDB alle Tabellen einer Datenbank in einer einzigen Datei abgelegt werden.
Dies macht es sehr schwer, mal eben eine einzelne Tabelle zu Backuppen oder im laufenden Betrieb wieder herzustellen. Muss man ein Backup einspielen, so müssen entsprechend alle Zugriffe auf die Tabellen der Datenbank unterbrochen werden und die entsprechenden Anwendungen heruntergefahren werden, was unter Umständen nich praktikabel ist.
Wie ich aber dem Dem offiziellen MySQL 5-Handbuch entnehmen konnte, gibt es durchaus die Möglichkeit unter InnoDB, ähnlich, wie bei myIsam tabellenbasierte Dateien zu benutzen. Das ganze wird dann Multi-Tablespaces genannt und ist recht einfach zu konfigurieren.
Man muss lediglich in der
my.cnf
im Abschnitt
[mysqld]
folgende Zeile einfügen:
bbinnodb_file_per_table
Nach dem Neustart des MySQL-Servers wird für jede neu angelegte Tabelle eine Datei nach dem Schema
tbl_name.ibd
angelegt.
Dies ähnelt dem Verhalten von MyIsam, mit dem Unterschied, dass bei InnoDB sowohl die eigentlichen Daten, als auch die Indizes in diese eine Datei geschrieben werden, wohingegen MyIsam hierfür jeweils eine eigene Datei anlegt.
Die
tbl_name.frm
wird analog bei beiden Storage Engines angelegt.
Bereits bestehende Tabellen verbleiben jedoch nach dem Neustart in der bisherigen Struktur, sprich in einer Datei für die jeweilige Datenbank, nur neu angelegte Tabellen werden in separate Dateien geschrieben. Umgekehrt bleiben diese Tabellen auch in einzelnen Dateien, wenn man die die Verwendung von Multi-Tablespaces wieder deaktiviert.
Auch hiernach werden nur die neu angelegten Tabellen wieder in die “globale” Shared-Space-Datei geschrieben.
Auf diese Weise kann man natürlich auch nur bestimmte Tabellen in einzelne Dateien schreiben und den “Rest” wie gewohnt in einer Datei vorhalten.
Da ich zur Zeit oft vor dem Problem stehe, dass ich aufgrund von vielen Einzeltabellen, die unter einer Merge-Table liegen, zu viele geöffnete Dateien habe, überlege ich, ob es in diesem Falle nicht sinnvoll wäre diese Tabellen in InnoDB in einen Shared-Tablespace zu legen…
[UPDATE]
Gute Idee, doch leider funktioniert die MERGE-Storage-Engine nicht mit InnoDB. Tja, schade.