严重的页损坏会导致当执行select 语句时或者当innodb后台操作时的意外退出或者中断,甚至会导致innodb前滚恢复的崩溃。这种情况下,可以使用innodb_force_recovery选项强制在启动时抑制后台操作运行,从此你可以导出你的表。
只有在紧急情况下才需要将innodb_force_recovery设置成一个非0值,以便启动innodb,然后导出表。在这之前,应该先将数据库copy一份,以备重建。大于或等于4的值可能会永久损坏数据文件。建议在测试库上成功使用了4之后再在生产环境使用大于等于4的值。当要强制恢复时,应该先用1,如有必要再慢慢增加。
innodb_force_recovery的枚举值是0-6,默认情况下是0。较大值会包括较小值的功能,例如,当值为3时,会包括1,2的所有功能。当值大于0时,innodb不允许DML语句,当值大于4时,innodb会设置为只读模式。
枚举值介绍:
1(SRV_FORCE_IGNORE_CORRUPT)
让服务器运行,即使检测到坏页。在select * from table时尝试跳过损坏的索引或者坏页。
2 (SRV_FORCE_NO_BACKGROUND)
阻止master 线程,purge线程运行。这会阻止purge操作过程中意外退出
3 (SRV_FORCE_NO_TRX_UNDO)
崩溃恢复后不会进行rollback
4 (SRV_FORCE_NO_IBUF_MERGE)
不会进行插入缓存合并,将innodb设置为只读模式。该模式会造成数据文件的永久损坏。设定该值之后需要删除并重建二级索引。
5 (SRV_FORCE_NO_UNDO_LOG_SCAN)
启动时不会读取undo日志的信息,会将没完成的事务看为已提交。
6 (SRV_FORCE_NO_LOG_REDO)
恢复时不会应用redo log
开启force recovery只需在配置文件中加下面这行:
[mysqld]innodb_force_recovery = 1
