Guide mySQL-Datenbank-Reparatur
Aus EUserv Wiki
Languages: |
Deutsch • English |
MySQL-Datenbank-Reparatur
Inhaltsverzeichnis |
MySQL-Datenbank-Reparatur
Allgemeines
In dem folgenden Wiki-Artikel finden Sie eine Anleitung, wie Sie Ihre MySQL-Datenbank auf Fehler überprüfen und reparieren können.
MyISAM-Tabellen
Überprüfung
Werkzeug: mysqlcheck
Zur Überprüfung Ihrer MySQL-Datenbank dient der Client mysqlcheck. Dieser prüft, repariert, optimiert und analysiert Tabellen.
Das Hilfsprogramm mysqlcheck kann ausgeführt werden, wenn der MySQL-Server noch ausgeführt wird.
Der Client stellt die SQL-Anweisungen CHECK TABLE, REPAIR TABLE, ANALYZE TABLE und OPTIMIZE TABLE zur Verfügung.
Führen Sie zur Überprüfung den folgenden Befehl in Ihrem Konsolenfenster aus:
mysqlcheck -u <username> -p --all-databases --analyze --check
Dabei ersetzen Sie <username> durch Ihren entsprechenden MySQL-Benutzernamen. Geben Sie hier nun Ihr entsprechendes MySQL-Passwort ein:
Enter password:
Der Parameter --all-databases überprüft alle Datenbanken auf Fehler, --analyze analysiert die Tabellen der Datenbank und --check überprüft hierbei die Tabellen auf Fehler.
Unter dem folgenden Link finden Sie eine Dokumentation zu mysqlcheck:
http://dev.mysql.com/doc/refman/5.1/de/mysqlcheck.html
Werkzeug: myisamchk
Das Hilfsprogramm myisamchk holt Informationen zu Ihren Datenbanktabellen und überprüft, repariert und optimiert sie.
Dieser Client sollte im Gegensatz zu mysqlcheck nur verwendet werden, wenn der MySQL-Server nicht mehr erreichbar ist.
Damit myisamchk Ihre Tabelle überprüfen kann, rufen Sie mit dem folgenden Befehl das Hilfsprogramm auf:
myisamchk --check <tablename>
Hier ist <tablename> durch den ensprechenden Namen der zu prüfenden Tabelle der MySQL-Datenbank anzugeben.
Dabei gibt der Parameter --check an, dass die Tabelle auf Fehler überprüft werden soll.
Zusätzlich können weitere Parameter angegeben werden:
- --check-only-changed prüft nur Tabellen, die seit der letzten Überprüfung geändert wurden
- --extend-check überprüft die Tabelle sehr gründlich und kann viel Zeit in Anspruch nehmen
- --fast überprüft nur Tabellen, die nicht ordnungsgemäß geschlossen wurden
Weitere Informationen zu myisamcheck können Sie aus der Dokumentation entnehmen:
http://dev.mysql.com/doc/refman/5.1/de/myisamchk.html
Werkzeug: phpMyAdmin
Falls Sie phpMyAdmin auf Ihrem Rootserver installiert haben und dieses für die Verwaltung Ihrer MySQL-Datenbanken nutzen, können Sie damit Ihre Datenbanken auf Fehler überprüfen.
Melden Sie sich bei phpMyAdmin an.
Wählen Sie die zu überprüfende MySQL-Tabelle aus Ihrer Datenbank aus.
Wählen Sie den Reiter Operationen aus.
Klicken Sie anschließend unten auf den Link Überprüfe Tabelle.
Der Befehl CHECK TABLE wurde ausgeführt und das Resultat wird Ihnen angezeigt.
Hier finden Sie die Dokumentation zum SQL-Befehl:
http://dev.mysql.com/doc/refman/5.1/de/check-table.html
Klicken Sie unten auf den Link Analysiere Tabelle.
Der Befehl ANALYZE TABLE wurde ausgeführt und Ihnen wird das Resultat angezeigt.
Hier finden Sie die Dokumentation zu diesem SQL-Befehl:
http://dev.mysql.com/doc/refman/5.1/de/analyze-table.html
Reparatur
Werkzeug: mysqlcheck
Mit dem Client mysqlcheck haben Sie im Falle einer defekten Datenbank die Möglichkeit, diese zu reparieren, auch wenn der MySQL-Server noch läuft.
Geben Sie dazu den folgenden Befehl ein:
mysqlcheck -u <username> -p <password> --auto-repair -o -c --all-databases
Dabei ersetzen Sie <username> und <password> durch Ihren entsprechenden MySQL-Benutzernamen und das entsprechende MySQL-Passwort. Der Parameter --all-databases überprüft alle Datenbanken auf Fehler, --auto-repair repariert automatisch beschädigte Tabellen der Datenbank, -o optimiert die Tabellen und -c überprüft alle Tabellen auf Fehler.
Unter dem folgenden Link finden Sie eine Dokumentation zu mysqlcheck:
http://dev.mysql.com/doc/refman/5.1/de/mysqlcheck.html
Werkzeug: myisamchk
Mit myisamchk kann eine Tabellenreparatur mit folgendem Befehl durchgeführt werden:
myisamchk --recover <tablename>
Dabei ist <tablename> durch den entsprechenden Namen der Tabelle der MySQL-Datenbank zu ersetzen. Der Parameter --recover führt eine Reparatur aus, die praktisch jedes Problem behebt.
Wenn sich die Tabelle durch --recover nicht wiederherstellen lässt, kann die Operation --safe-recover ausgeführt werden.
Dieser Parameter führt eine Reparatur unter Verwendung einer alten Wiederherstellungsmethode durch, die alle Datensätze der Reihe nach ausliest und alle Indexbäume entsprechend den gefundenen Datensätzen aktualisiert.
myisamchk --safe-recover <tablename>
Weitere Reparaturoptionen, welche myisamchk bereitstellt, können aus der Dokumentation entnommen werden:
http://dev.mysql.com/doc/refman/5.1/de/myisamchk-repair-options.html
Werkzeug: phpMyAdmin
Mit phpMyadmin haben Sie im Falle einer defekten Datenbank die Möglichkeit, diese zu reparieren.
Klicken Sie auf den Link Repariere Tabelle.
Der Befehl REPAIR TABLE wird ausgeführt und Ihnen wird das Resultat angezeigt. Hier finden Sie die Dokumentation zu diesem SQL-Befehl:
http://dev.mysql.com/doc/refman/5.1/de/repair-table.html
Klicken Sie auf den Link Optimiere Tabelle.
Der Befehl OPTIMIZE TABLE wird ausgeführt und Ihnen wird das Resultat angezeigt. Hier finden Sie die Dokumentation zu diesem SQL-Befehl:
http://dev.mysql.com/doc/refman/5.1/de/optimize-table.html
InnoDB-Tabellen
Überprüfung
Werkzeug: mysql und mysqlcheck
Wenn Sie MySQL mit InnoDB-Tabellen betreiben, deuten beispielsweise folgende Fehlermeldungen auf eine korrupte Datenbank hin:
InnoDB: (index “PRIMARY” of table “test”.”test”) InnoDB: Database page corruption on disk or a failed
Um alle Tabellen in Ihrer Datenbank auf Fehler zu überprüfen, steht folgender Befehl zur Verfügung:
mysqlcheck -u root -p --check --databases <dbname>
Ersetzen Sie dabei <dbname> durch den Namen Ihrer Datenbank.
Einzelne Tabellen können innerhalb der MySQL-Kommandozeile überprüft werden:
mysql -u root -p mysql> CHECK TABLE {<tablename>};
Werden Fehler gefunden, schaltet sich der MySQL Server bei InnoDB-Tabellen automatisch ab, um der Verbreitung weiterer Fehler vorzubeugen.
Reparatur
Werkzeug: OPTIMIZE TABLE
Der Befehl OPTIMIZE TABLE versucht, die Tabelle und Ihre Indizes wiederherzustellen. Auch hier besteht wieder die Möglichkeit, den Befehl global oder auf einzelne Tabellen anzuwenden:
mysqlcheck -u root -p --optimize --databases <dbname>
Dieser Befehl optimiert alle Tabellen der Datenbank (<dbname> muss durch den Namen der entsprechenden Datenbank ersetzt werden).
mysql -u root -p mysql> OPTIMIZE TABLE {<tablename>};
Dieser Befehl optimiert die gewählte Tabelle (<tablename> muss durch den Namen der entsprechenden Tabelle ersetzt werden).
Sollte die Warnung Table does not support optimize, doing recreate + analyze instead auftreten, stellt dies kein Problem dar. Der OPTIMIZE-Befehl verfährt bei InnoDB-Tabellen anders als bei MyISAM-Tabellen.
Hier finden Sie die Dokumentation zu diesem SQL-Befehl:
http://dev.mysql.com/doc/refman/5.1/de/optimize-table.html
Werkzeug: InnoDB Recovery
Der Wiederherstellungsmodus für InnoDB-Tabellen versucht, beschädigte Tabellen im laufenden Betrieb wiederherzustellen.
Stoppen Sie nun den MySQL Server:
mysqld stop
Nun wird der Recovery-Modus aktiviert. Fügen Sie dazu in der Konfigurationsdatei von MySQL
/etc/mysql/my.cnf
im Abschnitt [mysqld] die folgende Zeile hinzu:
innodb_force_recovery = 4
und starten anschließend den MySQL-Server neu:
mysqld start
Dies startet die InnoDB Storage-Engine. Der Wert nach dem "=" (0-6) gibt dabei die Striktheit der Datenkontrolle vor. Der Wert 4 lässt den MySQL-Server weiterlaufen, auch wenn dieser auf korrupte Datenstrukturen trifft. Gleichzeitig ist das Löschen, Schreiben und Updaten von Tabellen mit dieser Option nicht mehr möglich, sodass im Recovery-Betrieb keine Manipulation der Datenbank mehr möglich ist.
Erstellen Sie nun einen Dump der Datenbank zur Sicherung:
mysqldump -u user -p passwort -A > dump.sql
Stoppen Sie nun den MySQL Server und ändern Sie in
/etc/mysql/my.cnfden Wert von
innodb_force_recoveryauf 1.
Dies ermöglicht einen schreibenden Zugriff auf die Datenbank. Starten Sie den MySQL-Server nun neu und finden Sie die korrupte(n) Tabelle(n) manuell:
mysql -u root -p passwort mysql> select * from datenbank limit 10;
Erhöhen Sie den limit-Wert schrittweise, bis folgender Fehler auftaucht:
ERROR 2013 (HY000): Lost connection to MySQL server during query
Sie wissen nun, in welcher Zeile der betroffenen Tabelle der Fehler auftritt und können versuchen, diesen zu beheben bzw. die Tabelle mit DROP zu löschen.
Wenn Sie mit der Fehlerbehebung fertig sind, erstellen Sie einen zweiten Dump der nun korrigierten Datenbank und stoppen den MySQL Server:
mysqldump -u user -p passwort -A > dump2.sql mysqld stop
Löschen Sie den Inhalt des Verzeichnisses /var/lib/mysql/.
Entfernen Sie nun die Zeile
innodb_force_recovery = 4
aus der Datei /etc/mysql/my.conf
und starten Sie den MySQL-Server erneut:mysqld start
Lesen Sie den Dump nun erneut ein:
mysql -u user -p passwort < dump2.sql
Wenn die beschädigte InnoDB-Engine mit dem Maximalwert 6 von innodb_force_recovery nicht wiederhergestellt werden kann, ist die Wiederherstellung aus einem Backup erforderlich.