0x1b - ESCAPE
HTML PDF Postscript
 InnoDB Recovery 
Computer Geschrieben von Beat Rubischon (Link) am Mittwoch, 12. Dezember 2007, 09:25
aus dem *adrenalin-pur* dept.

Während einem mysqldump schlich sich diese Meldung in die Syslog:
InnoDB: Database page corruption on disk or a failed
InnoDB: file read of page 9049.
InnoDB: You may have to recover from a backup.
Der Weg zurück zur laufenden Datenbank im Text.

Den Server herunternehmen und den Tipp von MySQL befolgen, der unter dem Link in den weiteren Messages in der Syslog notiert ist:
# joe /etc/mysql/my.cnf
[mysqld]
#
# For recovery
innodb_force_recovery = 4
^K^X
DB Server manuell starten, damit die Messages nicht aus der Syslog gepfriemelt werden müssen:

# mysqld

Nun alle InnoDB basierenden Tabellen finden. Dafür über alle Datenbanken folgendes Kommando absetzen:

mysql> show table status from database;

Alle InnoDB Tabellen dumpen. Jede individuell, um den Uebeltäter mit dem defekten Block zu finden:

# mysqldump database table > database-table.sql

Die defekte Tabelle führt wahrscheinlich zu einem Crash des InnoDB Backends im mysqld und muss ohne Daten gedumpt werden:

# mysqladmim shutdown
# mysqld (in einem anderen Fenster)
# mysqldump -d database table > database-table.sql

Nun die DB wieder herunternehmen. Vieleicht noch ein Backup machen, bevor die Daten gelöscht werden:
# mysqladmin shutdown
# cd /var/lib/mysql
# tar cvf /home/db.tar .
# rm ib*
Wahrscheinlich sind auch einige MyISAM Tabellen defekt. Diese lassen sich zum Glück einfach reparieren:

# myisamchk -f */*.MYI

Nun den Server wieder starten:

# /etc/init.d/mysql start

und die Dumps wieder einspielen:

# mysql database < database-table.sql

InnoDB Korruptionen werden leider nicht an den Client weitergegeben. Entsprechend logt der mysqldump, den ich täglich mache, keine solchen Fehler. Ich habe ihn mit einem grep über die Syslog erweitert, um zukünftig solche Fehler möglichst zeitig zu entdecken:
#!/bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin

umask 0077
DIR=/var/backups/`date +%Y%m%d`
mkdir -p $DIR

mysqldump -Aa > $DIR/mysql.dump

grep mysqld /var/log/syslog
Und jetzt einen Kaffee!

Permalink