Guide mySQL-Datenbank-Reparatur

Aus EUserv Wiki

(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
(Werkzeug: mysqlcheck)
Zeile 24: Zeile 24:
   mysqlcheck -u <username> -p --all-databases --analyze --check
   mysqlcheck -u <username> -p --all-databases --analyze --check
-
Dabei ersetzen Sie '''<username>''' durch Ihren entsprechenden MySQL-Benutzernamen. Geben Sie nun Ihr entsprechendes MySQL-Passwort ein:
+
Dabei ersetzen Sie '''<username>''' durch Ihren entsprechenden MySQL-Benutzernamen. Geben Sie hier nun Ihr entsprechendes MySQL-Passwort ein:
   Enter password:
   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.<br>
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.<br>

Version vom 13:39, 29. Jan. 2013

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.

Datei:mysql1.png



Wählen Sie die zu überprüfende MySQL-Tabelle aus Ihrer Datenbank aus.

Datei:mysql2.png



Wählen Sie den Reiter Operationen aus.

Datei:mysql3.png



Klicken Sie anschließend unten auf den Link Überprüfe Tabelle.

Datei:mysql4.png



Der Befehl CHECK TABLE wurde ausgeführt und das Resultat wird Ihnen angezeigt.

Datei:mysql5.png



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.

Datei:mysql6.png



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.

Datei:mysql7.png



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

Datei:mysql8.png



Klicken Sie auf den Link Optimiere Tabelle.

Datei:mysql9.png



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

Datei:mysql10.png



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.cnf
den Wert von
innodb_force_recovery
auf 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.