内网发布用的配置数据库突然崩溃,查看mysql_error.log 可以看到只要一有写操作,一直在重复kill -6 -> recovery,无法自行恢复。摸索了两个小时,终于恢复完毕。现在记录一下主要的步骤。
停止服务,备份所有数据
1 | service stop 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 | mv ib_logfile0 ib_logfile0.bak |
恢复数据
调整启动参数forcing_innodb_recovery=0,再次启动mysql服务,启动成功后重新导入备份的数据:
1 | mysql -u name -p < ~/total.sql |
正常执行完毕的话,成功恢复数据。