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.
- Plattenplatz auf Linux mit ncdu analysieren - 9. August 2022
- MySQL InnoDB korrupt: Datenbank reparieren - 30. Juni 2022
- Linux Pakete zurückhalten - 26. April 2022