Probleme mit InnoDB in großen TYPO3 Installationen

In großen TYPO3 Installationen gibt es immer mal wieder Probleme mit der Datenbank, genauer gesagt mit InnoDB. Groß heißt: cache_pages > 1GB, Seiten > 10.000, hohe Serverauslastung. Obwohl InnoDB ausdrücklich für Cache-Tabellen empfohlen ist, kann es durch seinen strukturellen Aufbau zu groß werden.

Eine recht radikale Lösung ist, alle InnoDB Tabellen durch MyISAM zu ersetzen (s.u.).

Jetzt habe ich im Blog von Dimitry Dulepov eine Erklärung und Lösung gefunden, die um einiges besser klingt. InnoDB Tabellen wachsen immer weiter, selbst wenn Daten (wie der 1 GB Cache) gelöscht werden. Die Lösung ist im Prinzip folgende: man lässt InnoDB per Scheduler immer wieder neue Tabellen anlegen, und löscht die alten. Durch die InnoDB Option  innodb_file_per_table  werden einzelne Files pro Tabelle angelegt, d.h. eine neue Tabelle ist auch wirklich leer.

Unterschiede InnoDB und MyISAM

Der Hauptunterschied zwischen InnoDB und MyISAM besteht darin, dass InnoDB in Transaktionen arbeitet. Bei einem INSERT muss InnoDB nur den Datensatz blockieren, den es gerade schreibt, während unter MyISAM die ganze Tabelle blockiert wird. Dadurch ist InnoDB bei Tabellen mit vielen Schreibzugriffen (Cache, Login, RealURL, Indexed Search, sys_log) im Vorteil, während MyISAM bei Tabellen mit hauptsächlich Lesezugriff (SELECT) empfohlen wird.

Außerdem werden bei InnoDB gelöschte Einträge nicht wirklich gelöscht, sondern die Tabelle wächst intern immer weiter. Per Default sind alle Tabellen in einer großen .ibd Datei. (z.B. auf /data/ibdata1). Eine Anleitung zum Reset der InnoDB-Datei findet man hier (letzte Antwort): http://forums.mysql.com/read.php?22,63124,63124#msg-63124

Kundeninstallation: cache_pages > 1 GB

Genau das hat in einer Installation Probleme gemacht: cache_pages > 1 GB, und der wurde täglich geleert. Obwohl ANALYSE TABLE sagt es sei alles OK, konnte das DB Backup nicht mehr eingespielt werden, InnoDB ist mit verschiedenen Transaktionsfehlern abgebrochen.

Dazu kam, dass der Login immer wieder in ein Timeout lief, das sporadisch auftrat und keine erkennbare Ursache wie hohe Serverlast hatte. Offensichtlich hat InnoDB eine Transaktion nicht abschließen können, und damit die nächste Transaktion auf diese Tabelle verhindert. Ein FLUSH Table, Clear Table oder Optimize Table hat dann für ein paar Tage Abhilfe geschaffen, allerdings nicht dauerhaft.

Die damalige Lösung war, InnoDB komplett rauszuwerfen und alle Tabellen auf MyISAM umzustellen:

ALTER TABLE mytable ENGINE=MyISAM;

Damit sind alle Transaktionsfehler verschwunden. Und obwohl nicht empfohlen für Cache Tabellen, ist die Performance damit sogar besser geworden!

InnoDB bei Extensions ändern

Bei Extensions reicht es nicht aus, den Typ im phpmyadmin umzustellen, denn dann kommt im Extension Manager immer diese Meldung:

ALTER TABLE tx_realurl_pathcache ENGINE=InnoDB;

Dazu muss im in der Datei: ext_tables.sql am Ende des CREATE table statement

ENGINE=InnoDB;

in

ENGINE=MyISAM

ändern. Jetzt noch die Änderungen in der Datenbank aktualisieren, und es läuft.