MySQL Innodb Recovery崩溃恢复

​ 内网发布用的配置数据库突然崩溃,查看mysql_error.log 可以看到只要一有写操作,一直在重复kill -6 -> recovery,无法自行恢复。摸索了两个小时,终于恢复完毕。现在记录一下主要的步骤。

停止服务,备份所有数据

1
2
service stop mysql
tar -jcvf ~/mysql_data.tar.bz2 /var/lib/mysql

重启MySQL并备份数据

首先尝试直接启动,结果启动仍然失败。
尝试修改forcing_innodb_recovery的参数值,从1~6逐个尝试,最终在设置成2的时候启动成功。
这个参数值的含义如下:

Mode 1 当发现一个损坏的数据页时不让MYSQL实例自动崩溃
Mode 2 不启用后台操作
Mode 3 不尝试 回滚事务
Mode 4 不计算状态也不应用buffer change
Mode 5 在启动过程中不去关心undo log
Mode 6 在启动过程中不关心重做日志ib_logfiles, 不去做前滚

直接备份全库数据:

1
mysqldump -u name -p --all-databases> ~/total.sql

等待备份完成。

尝试Drop掉出问题的库/表

检查有问题的库/表

1
mysqlcheck -u name -p --all-databases

尝试drop掉出问题的表/库,如果成功,直接跳过下面这一步,如果drop失败了,这个时候就要强行删掉出问题的文件了。
停下mysql服务,尝试删掉出错的文件:

1
2
3
mv ib_logfile0 ib_logfile0.bak
mv ib_logfile1 ib_logfile1.bak
mv ibdata1 ibdata1.bak

恢复数据

调整启动参数forcing_innodb_recovery=0,再次启动mysql服务,启动成功后重新导入备份的数据:

1
mysql -u name -p < ~/total.sql

正常执行完毕的话,成功恢复数据。

参考资料