MySQL InnoDB korrupt: Datenbank reparieren

Der Server läuft nicht mehr korrekt. Die Datenbank ist down und lässt sich nicht mehr starten. Das kann daran liegen, dass InnoDB korrupt ist. Im folgenden Artikel lernen wir, wie wir MySQL im InnoDB-Recovery-Modus starten, MySQL neu installieren und anschließend die Datenbanken neu einspielen.

Achtung! Im folgenden Tutorial werden mehrere Datenbanken gedroppt. Wir empfehlen daher einen Snapshot des ganzen Servers zu erstellen, bevor die Anpassungen durchgeführt werden. Dieses Tutorial wurde auf einem Ubuntu 20.04 System getestet.

Prüfen ob InnoDB korrupt ist

Zunächst prüfen wir, ob die MySQL-Fehler wirklich aufgrund von korrupten InnoDB Tabellen auftauchen. Dafür prüfen wir das Logfile /var/log/mysql/error.log nach folgenden Zeilen:

InnoDB: Submit a detailed bug report to http://bugs.mysql.com.
InnoDB: If you get repeated assertion failures or crashes, even
InnoDB: immediately after the mysqld startup, there may be
InnoDB: corruption in the InnoDB tablespace. Please refer to
InnoDB: http://dev.mysql.com/doc/refman/8.0/en/forcing-innodb-recovery.html

Wenn wir diese Zeilen gefunden haben, können wir uns auf die nächsten Schritte vorbereiten.

Korruptes InnoDB im Recovery-Modus starten

Jetzt wollen wir MySQL zum laufen bringen, sodass wir unsere Datenbanken dumpen können:

Hierfür editieren wir unsere MySQL-Konfiguration (z.B. /etc/mysql/mysql.conf.d/mysqld.cnf).

[mysqld]
innodb_force_recovery = 1

Jetzt versuchen wir, ob wir MySQL wieder starten können:

/etc/init.d/mysql start

Wenn wir uns nun wieder an der Datenbank anmelden können, machen wir mit dem nächsten Schritt weiter.

Sollten wir uns nicht anmelden können, müssen wir innodb_force_recovery um 1 erhöhen, MySQL neu starten und erneut versuchen uns an MySQL anzumelden. Das wiederholen wir so oft, bis die MySQL-Anmeldung erfolgreich war. (Achtung: Bei innodb_force_recovery = 4 oder höher können Daten verloren gehen! Weitere Informationen zu innodb_force_recovery)

Datenbanken dumpen

Da wir uns jetzt wieder an der Datenbank anmelden können, werden wir nun einen Dump aller Datenbanken erstellen:

mysqldump -u root --all-databases > mysql_all_databases_dump-vorfix.sql

Dieser Befehl kann je nach Größe der Datenbank etwas Zeit in Anspruch nehmen. Nachdem der Befehl durchgelaufen ist, prüfen wir ob der Dump vollständig ist:

tail mysql_all_databases_dump-vorfix.sql

Wenn in der letzten Zeile Dump completed on ... steht, war der Dump erfolgreich.

MySQL neu installieren

Im folgenden Schritt werden wir MySQL zusammen mit allen Datenbanken deinstallieren.

Achtung! Mit den folgenden Befehlen werden ganze Datenbanken gelöscht. Wenn der Dump oder der Snapshot in den vorherigen Schritten fehlerhaft war, können Daten verloren gehen!

apt remove mysql-server
apt autoremove
rm -r /var/lib/mysql

Jetzt ist MySQL komplett deinstalliert. Wir werden es nun erneut installieren:

apt install mysql-server

Sollte die Option innodb_force_recovery noch in der Konfiguration aktiviert sein, müssen wir die Option jetzt entfernen. Danach starten wir MySQL neu und versuchen uns daran anzumelden:

/etc/init.d/mysql restart
mysql

Datenbank wieder einspielen

Wenn die Anmeldung erfolgreich war, spielen wir jetzt den Dump von vorhin ein:

mysql < /sicherung/mysql/mysql_all_databases_dump-vorfix.sql

Dieser Befehl wird länger dauern als die Dump-Erstellung. Wenn der Befehl durchgelaufen ist, starten wir ein letztes Mal MySQL neu:

/etc/init.d/mysql restart

Die Datenbanken und der gesamte Server sollten jetzt wieder korrekt laufen.

Weitere interessante Artikel zu Linux-Systemen finden Sie in unserem Blog.

Falls Sie weitere Fragen haben, können Sie uns kontaktieren.