So beheben Sie beschädigte Tabellen in MySQL

Note

Gelegentlich können MySQL-Tabellen beschädigt werden, was bedeutet, dass ein Fehler aufgetreten ist und die darin enthaltenen Daten nicht lesbar sind. Versuche, aus einer beschädigten Tabelle zu lesen, führen normalerweise zum Absturz des Servers.

Einige häufige Ursachen für beschädigte Tabellen sind:

  • Der MySQL-Server stoppt während eines Schreibvorgangs.

  • Ein externes Programm ändert eine Tabelle, die gleichzeitig vom Server geändert wird.

  • Die Maschine wird unerwartet heruntergefahren.

  • Die Computerhardware fällt aus.

  • Irgendwo im MySQL-Code ist ein Softwarefehler aufgetreten.

Wenn Sie den Verdacht haben, dass eine Ihrer Tabellen beschädigt ist, sollten Sie ein Backup Ihres Datenverzeichnisses erstellen, bevor Sie Fehler beheben oder versuchen, die Tabelle zu reparieren. Dies hilft, das Risiko eines Datenverlusts zu minimieren.

Stoppen Sie zuerst den MySQL-Dienst:

sudo systemctl stop mysql

Kopieren Sie dann alle Ihre Daten in ein neues Sicherungsverzeichnis. Auf Ubuntu-Systemen lautet das Standarddatenverzeichnis/var/lib/mysql/:

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

Nach dem Backup können Sie untersuchen, ob die Tabelle tatsächlich beschädigt ist. Wenn die TabelleMyISAM storage engine verwendet, können Sie überprüfen, ob sie beschädigt ist, indem Sie eineCHECK TABLE-Anweisung an der MySQL-Eingabeaufforderung ausführen:

CHECK TABLE table_name;

In der Ausgabe dieser Anweisung wird eine Meldung angezeigt, die Sie darüber informiert, ob sie beschädigt ist oder nicht. Wenn die MyISAM-Tabelle tatsächlich beschädigt ist, kann sie normalerweise repariert werden, indem die AnweisungREPAIR TABLEausgegeben wird:

REPAIR TABLE table_name;

Angenommen, die Reparatur war erfolgreich, wird in Ihrer Ausgabe eine Meldung wie die folgende angezeigt:

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

Wenn die Tabelle dennoch beschädigt ist, schlägt die MySQL-Dokumentation einigealternative methods for repairing corrupted tables vor.

Wenn andererseits die beschädigte TabelleInnoDB storage engine verwendet, ist der Reparaturprozess anders. InnoDB ist die Standard-Speicher-Engine in MySQL ab Version 5.5 und bietet automatisierte Überprüfungs- und Reparaturvorgänge für Beschädigungen. InnoDB prüft auf beschädigte Seiten, indem es auf jeder gelesenen Seite Prüfsummen durchführt. Wenn es eine Prüfsummen-Diskrepanz findet, stoppt es automatisch den MySQL-Server.

InnoDB-Tabellen müssen selten repariert werden, da InnoDB über einen Mechanismus zur Wiederherstellung nach einem Absturz verfügt, mit dem die meisten Probleme beim Neustart des Servers behoben werden können. Wenn Sie jedoch auf eine Situation stoßen, in der Sie eine beschädigte InnoDB-Tabelle neu erstellen müssen, empfiehlt die MySQL-Dokumentation die Verwendung von“Dump and Reload” method. Dazu müssen Sie den Zugriff auf die beschädigte Tabelle wiedererlangen und mit dem Dienstprogrammmysqldumpeinlogical backup der Tabelle erstellen, das die Tabellenstruktur und die darin enthaltenen Daten beibehält, und die Tabelle dann wieder in die Datenbank laden .

Versuchen Sie daher, den MySQL-Dienst neu zu starten, um festzustellen, ob Sie auf den Server zugreifen können:

sudo systemctl restart mysql

Wenn der Server weiterhin abstürzt oder auf andere Weise nicht erreichbar ist, kann es hilfreich sein, die Optionforce_recoveryvon InnoDB zu aktivieren. Sie können dies tun, indem Sie die Dateimysqld.cnfbearbeiten:

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

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

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

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

Speichern und schließen Sie die Datei und starten Sie den MySQL-Dienst erneut. Wenn Sie erfolgreich auf die beschädigte Tabelle zugreifen können, verwenden Sie das Dienstprogrammmysqldump, um Ihre Tabellendaten in einer neuen Datei abzulegen. Sie können diese Datei beliebig benennen, aber hier nennen wir sieout.sql:

mysqldump database_name table_name > out.sql

Löschen Sie dann die Tabelle aus der Datenbank. Um zu vermeiden, dass die MySQL-Eingabeaufforderung erneut geöffnet werden muss, können Sie die folgende Syntax verwenden:

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

Anschließend stellen Sie die Tabelle mit der soeben erstellten Sicherungsdatei wieder her:

mysql -u user -p < out.sql

Beachten Sie, dass die InnoDB-Speicher-Engine im Allgemeinen fehlertoleranter ist als die ältere MyISAM-Engine. Tabellen, die InnoDBcanverwenden, sind immer noch beschädigt, aber aufgrund vonauto-recovery featuresist das Risiko von Tabellenbeschädigungen und Abstürzen deutlich geringer.

Related