mysql数据库故障修复一例

某线上服务器的mysql突然崩溃后,重启一直失败。查看mysql的error.log发现如下错误信息:

InnoDB: Serious error! InnoDB is trying to free page 716
InnoDB: though it is already marked as free in the tablespace!
InnoDB: The tablespace free space info is corrupt.
InnoDB: You may need to dump your InnoDB tables & recreate the whole
InnoDB: database!

尝试了各种修复方法均告失败,看来只能重建数据库了。

首先解决无法启动的问题(参见http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html的说明):

先添加如下设置到my.cnf:

# vi /etc/mysql/my.cnf

[mysqld]
innodb_force_recovery = 1

保存my.cnf退出vi后重启mysql:

# service mysql start

但重启依然失败。

按上述官方文档提示,尝试提高recovery级别到2:

[mysqld]
innodb_force_recovery = 2

这次重启成功了,并且可以正常查询,但此时mysql处于只读状态,无法做update、delete等写操作。下面开始尝试先备份再恢复全部数据库。

1、备份全部数据库

mysqldump -uroot -p -AER > /root/recovery_dump.sql

2、删除全部数据库

mysql> SET FOREIGN_KEY_CHECKS=0;
mysql> DROP DATABASE db1;
mysql> DROP DATABASE db2;
...

如果数据库太多,可使用如下命令批量删除。注意:<password>应该替换为真实密码。

# mysql -uroot -p<password>  -e "show databases" | grep -v Database | grep -v mysql| grep -v information_schema| grep -v test | grep -v OLD |gawk '{print "drop database " $1 ";select sleep(0.1);"}' | mysql -uroot -p<password>

3、停止mysql。注意应该禁用innodb_fast_shutdown,确保mysql完全停止。

# mysql -uroot -p -e "SET GLOBAL innodb_fast_shutdown = 0"
# service mysql stop

4、完全删除mysql数据和日志

rm /var/lib/mysql/ibdata*
rm /var/lib/mysql/ib_log*

5、重启mysql并导入备份的数据:

# service mysql start
# mysql -uroot -p < /root/recovery_dump.sql

至此mysql终于启动正常了,数据也完全恢复成功。

发表评论

电子邮件地址不会被公开。 必填项已用*标注