Bei einem meiner Arbeitgeber hatten wir am Wochenende für eine halbe Stunde Stromausfall. Leider hingen alle Server an der USV, bis auf unser mySQL Server (Budgetgründe…).
Nach dem Einschalten lief das Debian-System auch prima, nur mySQL wollte nicht wieder starten.
Bei
service mysql start
endete die Routine nach ein paar Sekunden mit „failed“.
Ein Blick ins syslog brachte folgende Fehlermeldung zu Haufe:
InnoDB: Unable to lock ./ibdata1, error: 11 InnoDB: Check that you do not already have another mysqld process InnoDB: using the same InnoDB data or log files. InnoDB: Error in opening ./ibdata1
Ab und an auch mit ib_logfile0 und ib_logfile1 als Datei.
Der mySQL-Server war trotzdem am laufen (mysqld_safe) und konnte von außen angesprochen werden. Jegliche Abfrage an eine Tabelle, die mit InnoDB als Engine läuft, führte aber zur Fehlermeldung:
Error 'Unknown table engine 'InnoDB'' on query.
Nach einigem Hin und Her habe ich das Problem dann „gelöst“.
Wie mySQL im syslog richtig meckert war die Datei
/var/lib/mysql/ibdata1
noch gelockt. Vermutlich durch den Stromausfall wurde die Datei nicht mehr freigegeben. Auch wenn sie bei lsof nicht als geöffnet angezeigt wurde scheint sich mySQL nicht „herangetraut“ zu haben.
In dem Fall musste die Datei quasi „neu“ angelegt werden, da es zumindest meiner Meinung nach keine Möglichkeit gab, mySQL beizubringen, dass die Datei „frei“ ist.
Entsprechend hat Folgendes geholfen:
/var/lib/mysql# mv ibdata1 ibdata1.bak /var/lib/mysql# cp -a ibdata1.bak ibdata1 /var/lib/mysql# rm ibdata1.bak
Damit wurde die Datei neu geschrieben, als Kopie der alten Datei. Damit ging auch der File-Lock verloren und mySQL startete wieder problemlos.
Tipp am Rande!
Auf jeden Fall nach einem Crash die Funktion „mysqlcheck“ ausführen. Diese repariert das Gesamtwerk und schließt noch offene Tables-Enden/Datenbanken.