MySQL: InnoDB-Engine nicht verfügbar

Die InnoDB-Engine für MySQL bietet gegenüber MyISAM einige Vorteile wie Transactions, feineres Locking und harte Fremdschlüsselbeziehungen.
Deshalb setzen wir InnoDB gerne für unsere Projekte ein, beispielsweise für Webapplikationen auf Basis von CakePHP.

Es kann das Problem auftreten, dass sich in einer Datenbank nur MyISAM-Tabellen anlegen lassen, aber keine InnoDB-basierten. Prüft man die verfügbaren Engines im mysql-Prompt mit dem Befehl SHOW ENGINE;, dann erhält man in etwa folgende Ausgabe:

show-engines

Offensichtlich fehlt hier also InnoDB in der Liste. Der Ursache kommt man mit einem Blick in das Syslog auf die Spur:

$:[~]:$ tail /var/log/syslog
08:17:21 test mysqld: 131107 8:17:21 InnoDB: Initializing buffer pool, size = 8.0M
08:17:21 test mysqld: 131107 8:17:21 InnoDB: Completed initialization of buffer pool
08:17:21 test mysqld: InnoDB: Error: log file ./ib_logfile0 is of different size 0 5242880 bytes
08:17:21 test mysqld: InnoDB: than specified in the .cnf file 0 104857600 bytes!
08:17:21 test mysqld: 131107 8:17:21 [ERROR] Plugin 'InnoDB' init function returned error.
08:17:21 test mysqld: 131107 8:17:21 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.

In den Meldungen gibt MySQL schon deutlich mehr Auskunft darüber, wo das Problem besteht: Die Log-Datei entspricht in ihrer Größe auf der Festplatte nicht mehr der entsprechenden Einstellung in der Konfigurationsdatei. Deshalb verweigert die InnoDB-Engine den Start und MySQL greift nur auf die übrigen Engines zurück.

Lösung

Es ist wichtig, dass mysql beim Herunterfahren das Log korrekt wegschreibt, dazu setzt man:

mysql> SET GLOBAL innodb_fast_shutdown=1;
Query OK, 0 rows affected (0.00 sec)

Danach kann MySQL heruntergefahren werden:

$:[~]:$ /etc/init.d/mysql stop

Treten dabei keine Fehlermeldungen auf, können die bisherigen Log-Files weggeschoben und anschließend MySQL wieder gestartet werden:

$:[~]:$ find /var/lib/mysql -type f -name "ib_logfile?" -exec mv {} {}.bak \;
$:[~]:$ ls /var/lib/mysql/ib_logfile*
$:[~]:$ /etc/init.d/mysql start

Nachdem MySQL dann hochgefahren ist, sollte InnoDB bei SHOW ENGINES; erscheinen und in MySQL wieder nutzbar sein.

show-engines-innodb

Leave a Reply

Your email address will not be published. Required fields are marked *