Rootop 服务器运维与web架构

mysql5.6无法启动,通过设置启动时不进行前滚恢复启动

InnoDB: Failing assertion: addr.page == FIL_NULL || addr.boffset >= FIL_PAGE_DATA
key_buffer_size + (read_buffer_size + sort_buffer_size)*max_threads = 595198 K bytes of memory

开始以为是key_buffer_size、read_buffer_size、sort_buffer_size、max_threads这几个参数的问题,修改以后也没效果。
日志里也说遇到个bug,也不知道到底是不是bug。
查到一篇类似文章:https://blog.51cto.com/legehappy/2119514

通过设置innodb_force_recovery参数不进行回滚才启动数据库。

以下仅供参考!

具体方法:
1、先备份mysql的数据目录(生产中非常重要)!
2、修改my.cnf添加。

[mysqld]
innodb_force_recovery = 1

重启数据库。

这里有6个值可用:
作为一个安全措施,InnoDB 在innodb_force_recovery大于0时阻止INSERT,UPDATE或DELETE操作。对于MySQL5.6.15,将innodb_force_recovery设为4或更高会让InnoDB处于只读模式。

1 (SRV_FORCE_IGNORE_CORRUPT)
即使服务器检测到损坏的页仍让它运行。试图使SELECT* FROM tbl_name跳过损坏的索引记录和页,这样有助于转储表。

2 (SRV_FORCE_NO_BACKGROUND)
阻止主线程和任何清除线程的运行。如果崩溃会在清除操作中发生,该恢复值会阻止它。

3 (SRV_FORCE_NO_TRX_UNDO)
不要在崩溃恢复后运行事务回滚。

4 (SRV_FORCE_NO_IBUF_MERGE)
阻止插入缓冲合并操作。如果它们会导致崩溃,不要做这些。不计算表统计。这个值可以永久损坏数据文件。使用这个值后,准备号删除并重建所有辅助索引。在MySQL5.6.15中,设置InnoDB为只读。

5 (SRV_FORCE_NO_UNDO_LOG_SCAN)
在启动数据库时不查看撤消日志:InnoDB将即使未完成的事务也作为已提交。这个值可以永久损坏数据文件。在MySQL5.6.15中,设置InnoDB为只读。

6 (SRV_FORCE_NO_LOG_REDO)
不要通过恢复对重做日志进行前滚。这个值可能永久损坏数据文件。数据库页被留在一个陈旧的状态,这反过来又可能带给B-trees和其它数据库结构更多的损坏。在MySQL5.6.15中,设置InnoDB为只读。 

更多信息参考原文章,我这里通过设置为3后(从1-3挨个试的),数据库才启动,然后mysqldump备份数据,重装了mysql再导回去。

PS:
这台数据库是有定时备份的。只是为了研究一下怎么能恢复就没重装还原备份。

原创文章,转载请注明。本文链接地址: https://www.rootop.org/pages/4711.html

作者:Venus

服务器运维与性能优化

评论已关闭。