MySQL-InnoDB-Speicher automatisch freigeben

Bei der Entwicklung mit Magento ist der Magento-Cache oft deaktiviert. Damit die Testumgebung trotzdem möglichst schnell bleibt, lohnt es sich, diese in einer RAM-Disk oder zumindest auf einer SSD-Festplatte laufen zu lassen. Doch bei schnellem Speicher ist jedes Gigabyte immer noch sehr kostbar!

Magento verwendet die InnoDB-Engine. Diese Engine bringt viele Vorteile mit sich gegenüber der MyISAM-Engine, aber auch einen Nachteil: Durch Löschen einer InnoDB-Tabelle oder eines ganzen Datenbankschemas mit InnoDB-Tabellen wird der Speicher innerhalb des Tabellenraums zwar teilweise freigegeben, aber die Größe der Tabellenraum-Datei (typische Speicherorte: mysql/data/ibdata1 oder /var/lib/mysql/ibdata1) nicht automatisch reduziert. Der Speicher auf der Festplatte bleibt belegt.

Durch mehrfache Wiederherstellungen von Datenbanken, Importe, Tabellen für Abfragetests und sonstige Experimente wächst der InnoDB-Tabellenraum auf der Festplatte immer weiter, sodass irgendwann der Speicher einer RAM-Disk aufgebraucht und kein vernünftiges Arbeiten mehr möglich ist. Eine Defragmentierung des InnoDB-Tabellenraums ist nicht vorgesehen. Um den Speicher auf der Festplatte freizugeben, muss der Tabellenraum komplett neu angelegt werden:

  1. Alle Datenbanken werden exportiert (z.B. mit mysqldump),
  2. alle Datenbankschemata mit InnoDB-Tabellen gelöscht (DROP SCHEMA …),
  3. der Datenbankserver wird heruntergefahren,
  4. Tabellenraumdateien werden gelöscht (in der Standardkonfiguration sind das die Dateien drei Dateien ibdata1, ib_logfile0, ib_logfile1 im Verzeichnis mysql/data)
  5. der Datenbankserver gestartet,
  6. alle gelöschten Datenbankschemata angelegt (CREATE SCHEMA …),
  7. Tabellenstrukturen und Daten von Exports wiederhergestellt.

Damit in Zukunft der Festplattenspeicher bereits beim Löschen von InnoDB-Tabellen freigegeben wird, müssen die Tabellendaten in jeweils einem eigenen Tabellenraum gespeichert sein. Hierzu kann vor dem Start des Datenbankservers der Parameter innodb_file_per_table in die my.ini bzw. my.cnf im mysqld-Block eingetragen werden:

[mysqld]
...
innodb_file_per_table
...

Die Datei ibdata1 wird u. a. für diverse Verwaltungsdaten weiterhin benötigt. Die eigentlichen Nutzdaten und Indizes werden nun aber in *.ibd-Dateien im jeweiligen Schema-Verzeichnis abgelegt (z.B. catalog_category_product.ibd).

Weitere Informationen zum Per-Table Tablespace in der MySQL-Referenz.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.