记一次mysql 异常停电数据库损坏恢复的方法
mysql innodb 引擎损坏恢复的参考资料还是很多的,以下记录一个问题的处理
问题
异常停电,mysql 重启异常,innodb tablespace 异常
一般常见的解决方法
备份,删除ibdata1,ib_logfile* 等文件,配置
innodb_force_recovery = 6
innodb_purge_threads = 1
然后尝试重启
简单说明
以上方法不直接推荐使用,理论上先备份是最好的,也是应该做的,然后逐步尝试从1-6进行增加处理
当然不同的步骤进行的操作是不一样的,如果1可以进入(先备份),同时可以链接数据库特别好,链接
进行数据备份(很重要),然后尝试不同的级别,查看mysql server log,查看信息,一般会有提示信息的
告诉我们那种表的有异常(也可以使用mysqlcheck工具)
碰到的几个问题
可能系统比较好,异常停电的时候,1 可以进入然后就进行了备份操作(dump),然后就打算使用6模式
进行数据处理了(首先进行了db 数据备份),然后删除ibdata1,ib_logfile* 结果提示table 不存在,感觉
不对,然后基于已有的备份,直接替换删除的文件,还是使用6模式,特别好,直接可以访问数据库,同时
给了一个比较好的err 提示(mysql server 日志)index 异常(就一张表,特别好),因为上边已经备份了
数据库,为了方便又进行了异常索引表数据的备份,因为模式是6不能进行删除操作,所以在系统db 创建了
又异常的表,停止mysql 然后copy 了frm文件到有问题的db 系统,然后修改模式为1,此模式下我们可以进行
数据表的操作,然后我们删除了有异常的table,重新导入数据进行恢复,之后停止mysql,修改innodb_force_recovery
为默认的,启动mysql 测试发现系统已经正常了,实际上我们全程可以基于1模式进行数据库的恢复
总结
进行恢复的时候尽备份很重要,遇到问题不能着急,应该思考下(尤其比较重要的db系统),同时对于依赖db的系统
也应该进行可能的停机(避免数据不一致的操作),官方文档是特别好的资料,不能直接百度搜索解决问题
参考资料
https://dev.mysql.com/doc/refman/8.0/en/forcing-innodb-recovery.html
https://www.askmaclean.com/archives/innodb-corruption-recover-guide.html