Wie man beschädigte Tabellen in MySQL repariert

0 Aktien
0
0
0
0

Einführung

Manchmal können MySQL-Tabellen beschädigt werden, was bedeutet, dass ein Fehler aufgetreten ist und die darin gespeicherten Daten nicht mehr gelesen werden können. Der Versuch, aus einer beschädigten Tabelle zu lesen, führt in der Regel zu einem Serverabsturz.

Häufige Ursachen für Tabellenbeschädigungen sind unter anderem:

  • Der MySQL-Server stoppt mitten in einem Schreibvorgang.
  • Eine externe Anwendung modifiziert eine Tabelle, die gleichzeitig vom Server modifiziert wird.
  • Das Gerät schaltet sich unerwartet aus.
  • Computerhardware versagt.
  • Irgendwo im MySQL-Code befindet sich ein Softwarefehler.

Wenn Sie vermuten, dass eine Ihrer Tabellen beschädigt ist, sollten Sie Ihre Datenliste sichern, bevor Sie mit der Fehlersuche beginnen oder versuchen, die Tabelle zu reparieren. Dadurch wird das Risiko eines Datenverlusts verringert.

Zuerst muss der MySQL-Dienst gestoppt werden:

sudo systemctl stop mysql

Kopieren Sie anschließend alle Ihre Daten in einen neuen Sicherungsordner. Auf Ubuntu-Systemen befindet sich das Standarddatenverzeichnis unter /var/lib/mysql/.

cp -r /var/lib/mysql /var/lib/mysql_bkp

Sobald Sie die Sicherung erstellt haben, können Sie überprüfen, ob die Tabelle tatsächlich beschädigt ist. Wenn die Tabelle die MyISAM-Speicher-Engine verwendet, können Sie dies tun, indem Sie MySQL neu starten und die Anweisung CHECK TABLE in der MySQL-Eingabeaufforderung ausführen.

sudo systemctl start mysql
CHECK TABLE table_name;

In der Ausgabe dieser Anweisung wird eine Meldung angezeigt, die Sie darüber informiert, ob die Tabelle beschädigt ist. Wenn die MyISAM-Tabelle tatsächlich beschädigt ist, kann sie in der Regel durch Ausführen der Anweisung REPAIR TABLE repariert werden:

REPAIR TABLE table_name;

Sofern die Reparatur erfolgreich war, wird in Ihrer Ausgabe eine Meldung wie diese angezeigt:

Output
+--------------------------+--------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+--------------------------+--------+----------+----------+
| database_name.table_name | repair | status | OK |
+--------------------------+--------+----------+----------+

Falls die Tabelle immer noch beschädigt ist, schlägt die MySQL-Dokumentation einige alternative Methoden zur Reparatur beschädigter Tabellen vor.

Verwendet die beschädigte Tabelle hingegen die InnoDB-Speicher-Engine, verläuft die Reparatur anders. InnoDB ist seit Version 8.0 die Standard-Speicher-Engine in MySQL und verfügt über eine automatische Fehlererkennung und -behebung. InnoDB prüft jede gelesene Seite auf beschädigte Seiten, indem es Prüfsummen berechnet. Wird eine Abweichung in der Sortierung festgestellt, stoppt InnoDB automatisch den MySQL-Server.

Die Reparatur von InnoDB-Tabellen ist selten nötig, da InnoDB über einen Mechanismus zur Wiederherstellung nach einem Serverneustart verfügt, der die meisten Probleme behebt. Sollten Sie jedoch eine beschädigte InnoDB-Tabelle wiederherstellen müssen, empfiehlt die MySQL-Dokumentation die Methode „Sichern und erneut laden“. Dabei wird der Zugriff auf die beschädigte Tabelle wiederhergestellt, mithilfe des Dienstprogramms „mysqldump“ eine logische Sicherung der Tabelle erstellt, die die Tabellenstruktur und die darin enthaltenen Daten beibehält, und die Tabelle anschließend wieder in die Datenbank geladen.

Starten Sie daher den MySQL-Dienst neu, um zu prüfen, ob Sie dadurch wieder auf den Server zugreifen können:

sudo systemctl restart mysql

Wenn der Server ausgefallen oder nicht erreichbar ist, kann es hilfreich sein, die InnoDB-Option `force_recovery` zu aktivieren. Dies erreichen Sie durch Bearbeiten der Datei `mysqld.cnf`. Unter Ubuntu und Debian befindet sich diese Datei üblicherweise im Verzeichnis `/etc/mysql`. Unter Red Hat und Rocky finden Sie sie üblicherweise unter `/etc/my.cnf.d`.

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Fügen Sie im Abschnitt [mysqld] die folgende Zeile hinzu:

. . .
[mysqld]
. . .
innodb_force_recovery=1

Speichern und schließen Sie die Datei und starten Sie anschließend den MySQL-Dienst neu. Wenn Sie erfolgreich auf die beschädigte Tabelle zugreifen können, verwenden Sie das Dienstprogramm mysqldump, um Ihre Tabellendaten in eine neue Datei zu exportieren. Sie können diese Datei beliebig benennen; hier nennen wir sie dump.sql.

mysqldump database_name table_name > out.sql

Löschen Sie anschließend die Tabelle aus der Datenbank. Um zu vermeiden, dass der MySQL-Befehl erneut ausgeführt wird, können Sie folgenden Befehl verwenden:

mysql -u user -p --execute="DROP TABLE database_name.table_name"

Anschließend stellen Sie die Tabelle mithilfe der erstellten Dump-Datei wieder her:

mysql -u user -p < out.sql

Beachten Sie, dass die InnoDB-Speicher-Engine im Allgemeinen fehlertoleranter ist als die ältere MyISAM-Engine. Zwar können auch InnoDB-Tabellen beschädigt werden, doch aufgrund der Selbstheilungsfunktionen ist das Risiko von Tabellenbeschädigung und -ausfall deutlich geringer.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Das könnte Ihnen auch gefallen