Reparatur von beschädigten MySQL-Tabellen
Gelegentlich können MySQL-Tabellen beschädigt werden, was bedeutet, dass ein Fehler aufgetreten ist und die darin enthaltenen Daten nicht mehr lesbar sind. Versuche, auf eine beschädigte Tabelle zuzugreifen, führen normalerweise zum Absturz des Servers.
Häufige Ursachen für beschädigte Tabellen
- Der MySQL-Server wird während eines Schreibvorgangs gestoppt.
- Ein externes Programm ändert eine Tabelle, die gleichzeitig vom Server bearbeitet wird.
- Der Rechner wird unerwartet heruntergefahren.
- Die Computerhardware versagt.
- Es gibt einen Softwarefehler im MySQL-Code.
Backup vor der Fehlersuche
Wenn Sie vermuten, dass eine Ihrer Tabellen beschädigt ist, sollten Sie vor der Fehlersuche oder der Reparatur ein Backup Ihres Datenverzeichnisses erstellen. Dies minimiert das Risiko eines Datenverlusts.
Stoppen des MySQL-Dienstes
Zuerst stoppen Sie den MySQL-Dienst:
sudo systemctl stop mysql
Hinweis: Auf einigen Plattformen wie Rocky Linux kann der MySQL-Dienst mysqld
heißen.
Erstellen eines Backups
Danach kopieren Sie alle Ihre Daten in ein neues Backup-Verzeichnis. Auf Ubuntu-Systemen befindet sich das Standarddatenverzeichnis unter /var/lib/mysql/
:
cp -r /var/lib/mysql /var/lib/mysql_bkp
Überprüfung auf Beschädigungen
Nachdem Sie das Backup erstellt haben, können Sie untersuchen, ob die Tabelle tatsächlich beschädigt ist. Wenn die Tabelle die MyISAM-Speicher-Engine verwendet, können Sie dies überprüfen, indem Sie MySQL neu starten und eine CHECK TABLE
-Anweisung ausführen:
sudo systemctl start mysql
CHECK TABLE table_name;
Reparatur von MyISAM-Tabellen
Eine Nachricht erscheint in der Ausgabe dieser Anweisung, die angibt, ob die Tabelle beschädigt ist. Wenn die MyISAM-Tabelle tatsächlich beschädigt ist, kann sie normalerweise durch eine REPAIR TABLE
-Anweisung repariert werden:
REPAIR TABLE table_name;
Ausgabe-Beispiel
Wenn die Reparatur erfolgreich war, sehen Sie eine Nachricht wie diese in der Ausgabe:
+--------------------------+--------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+--------------------------+--------+----------+----------+
| database_name.table_name | repair | status | OK |
+--------------------------+--------+----------+----------+
Bearbeitung von InnoDB-Tabellen
Wenn die beschädigte Tabelle die InnoDB-Speicher-Engine verwendet, ist der Reparaturprozess anders. InnoDB ist ab MySQL-Version 8.0 die Standard-Speicher-Engine und verfügt über automatisierte Prüf- und Reparaturvorgänge.
MySQL neu starten
Versuchen Sie, den MySQL-Dienst neu zu starten:
sudo systemctl restart mysql
Verwendung der Option Force Recovery
Wenn der Server weiterhin nicht zugänglich ist, aktivieren Sie die Option force_recovery
in der Datei mysqld.cnf
:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Fügen Sie in der Sektion [mysqld]
die folgende Zeile hinzu:
[mysqld]
innodb_force_recovery=1
Speichern und schließen Sie die Datei, und starten Sie den MySQL-Dienst erneut:
sudo systemctl restart mysql
Dumpen und Neu-Laden der Tabelle
Wenn Sie erfolgreich auf die beschädigte Tabelle zugreifen können, verwenden Sie das Tool mysqldump
, um ein neues Backup der Tabelle zu erstellen:
mysqldump database_name table_name > out.sql
Löschen Sie dann die Tabelle aus der Datenbank:
mysql -u user -p --execute="DROP TABLE database_name.table_name"
Laden Sie anschließend die Tabelle mit der erstellten Dump-Datei wieder in die Datenbank:
mysql -u user -p < out.sql
Fazit
Die InnoDB-Speicher-Engine ist im Allgemeinen fehlertoleranter als die ältere MyISAM-Engine. Obwohl auch InnoDB-Tabellen beschädigt werden können, minimieren ihre Auto-Recovery-Funktionen das Risiko von Tabellenbeschädigungen und Abstürzen erheblich.