Donnerstag, September 13, 2007

MySQL: Table is marked as crashed and should be repaired

Als ich gestern phpMyAdmin auf einem von mir betreuten Web-Server aufrief, erhielt ich folgende Fehlermeldung präsentiert:

#145 - Table './wsu/smt_stats' is marked as crashed and should be repaired 

Hossa! In meiner ganzen Karriere habe ich so etwas noch nie erlebt. Nun, was tun? phpMyAdmin verfügt in seiner Oberfläche unter tabelle > Operations > Table Maintenance diverse Möglichkeiten zur Fehlerbehebung:

  • Check table
  • Analyze table
  • Repair table
  • Optimize table

Leider waren diese Befehle im aktuellen Fall nicht zugänglich - anstelle der Liste erschien oben genannte Fehlermeldung.

Glücklicherweise kann man in der Tabellenübersicht einer Datenbank Tabellen mit der Checkbox markieren und aus dem Befehle-Drop-Down dann 'Repair' auswählen. Leider brachte dies nichts, die Fehlermeldung erschien weiterhin. Das Problem schien schwerwiegender zu sein, als zuerst angenommen.

Deshalb ging es einerseits rüber zu Google, ums ich über die Möglichkeiten der Tabellenreparatur schlau zu machen, andererseits per SSH auf den Server selbst.

Auf Ways to repair MYSQL Databases fand ich Empfehlungen für solche Fälle, welche ich der Reihe nach ausprobierte.

mysqlcheck

hist-web:~# mysqlcheck -uroot -p wsu smt_stats
Enter password: 
wsu.smt_stats
error    : Table './wsu/smt_stats' is marked as crashed and should be repaired

Oookey ... der Nächste bitte!

myisamchk

Zuerst fährt man MySQL ordnungsgemäss herunter:

/etc/init.d/mysql stop

Dann kann man sich mit dem Brachial-Tool ans Werk machen:

hist-web:/var/lib/mysql/wsu# myisamchk smt_stats.MYI
Checking MyISAM file: smt_stats.MYI
Data records:  139144   Deleted blocks:       0
myisamchk: warning: Table is marked as crashed
- check file-size
myisamchk: error: Size of datafile is: 10473472          Should be: 10473480
- check record delete-chain
- check key delete-chain
- check index reference
- check data record references index: 1
myisamchk: error: Found 139145 keys of 139144
- check record links
myisamchk: error: Recordlink that points outside datafile at 10473420
MyISAM-table 'smt_stats.MYI' is corrupted
Fix it using switch "-r" or "-o"

Ich tat, wie mir befohlen wurde:

hist-web:/var/lib/mysql/wsu# myisamchk -r smt_stats.MYI
- recovering (with sort) MyISAM-table 'smt_stats.MYI'
Data records: 139144
- Fixing index 1
Found block that points outside data file at 10473420

Zur Sicherheit überprüfte ich die Tabelle erneut:

hist-web:/var/lib/mysql/wsu# myisamchk smt_stats.MYI
Checking MyISAM file: smt_stats.MYI
Data records:  139144   Deleted blocks:       0
- check file-size
- check record delete-chain
- check key delete-chain
- check index reference
- check data record references index: 1
- check record links

Da alles wieder rosig aussah, konnte man MySQL wieder hochfahren:

/etc/init.d/mysql start

Labels:

8 Kommentare | neuen Kommentar verfassen

Kommentare

neuen Kommentar verfassen

Blogger quick_silver um 27.05.2008 20:23:00 Uhr

Danke, hat mir sehr geholfen. Hab dich auch auf meinem Blog verlinkt:
http://www.niondir.de/blogs/index.php/2008/05/27/mysql-table-crashed

Blogger Jonas um 30.05.2008 14:27:00 Uhr

Kuul, hatte den Fehler auch mit einer Tabelle in meinem phpBB-Forum, konnte das aber in phpMyAdmin schon reparieren.

Anonymous Teamghost um 05.09.2008 11:02:00 Uhr

Jajajajaja

Funktioniert auch mit

'./wikidb/searchindex' is marked as crashed and should be repaired

von MediaWiki.

Danke

Anonymous BadMad um 06.10.2008 23:31:00 Uhr

Danke! Das hat auch eben meine comments Tabelle gerettet :) Hab das gleich mal verlinkt bei mir!

Anonymous telly um 09.10.2008 01:19:00 Uhr

Danke, genau das was ich gesucht hab. Hat bestens geklappt.

Blogger Pawsie um 02.04.2009 20:25:00 Uhr

Sehr hilfreich! Danke, Danke! :)

Blogger prdatur um 21.08.2009 11:09:00 Uhr

Bedank mich rechtherzlich, hat wunderbar funktioniert.

Blogger Elvin um 05.11.2009 15:45:00 Uhr

Danke für den Input, guter Thread. Hatte selbst auch das Problem, wollte aber bei einer produktiven Installation mysql nicht abwürgen. Deshalb habe ich es so gelöst:

In phpMyAdmin oder cmd:

REPAIR TABLE [table_name];

Bei mir hats so funktioniert.

Zitierungen dieses Artikels