MySQL--使⽤innodb_force_recovery修复数据库异常
当MySQL服务异常重启失败后,可以通过配置参数innodb_force_recovery来对MySQL服务进⾏修复启动。
参数innodb_force_recovery选项:
1 (SRV_FORCE_IGNORE_CORRUPT): 忽略检查到的 corrupt 页。尽管检测到了损坏的 page 仍强制服务运⾏。⼀般设置为该值即可,然后 dump 出库表进⾏重建。
2 (SRV_FORCE_NO_BACKGROUND): 阻⽌主线程的运⾏,如主线程需要执⾏ full purge 操作,会导致 crash。阻⽌ master thread 和任何 purge thread 运⾏。若 crash 发⽣在 purge 环节则使⽤该值。
3 (SRV_FORCE_NO_TRX_UNDO): 不执⾏事务回滚操作。
4 (SRV_FORCE_NO_IBUF_MERGE): 不执⾏插⼊缓冲的合并操作。如果可能导致崩溃则不要做这些操作。不要进⾏统计操作。该值可能永久损坏数据⽂件。若使⽤了该值,则将来要删除和重建辅助索引。
5 (SRV_FORCE_NO_UNDO_LOG_SCAN): 不查看重做⽇志,InnoDB 存储引擎会将未提交的事务视为已提交。此时 InnoDB 甚⾄把未完成的事务按照提交处理。该值可能永久性的损坏数据⽂件。
6 (SRV_FORCE_NO_LOG_REDO): 不执⾏前滚的操作。恢复时不做 redo log roll-forward。使数据库页处于废⽌状态,继⽽可能引起 B 树或者其他数据库结构更多的损坏。
参数innodb_force_recovery设置:
在配置⽂件中的mysqld模块添加参数innodb_force_recovery。
[mysqld]
innodb_force_recovery    =    N
相同参数innodb_force_recovery在不同MySQL版本允许的操作可能不同,所有版本中innodb_force_recovery>0时都允许对表进⾏SELECT操作。
mysql数据库损坏修复
使⽤参数innodb_force_recovery建议:
1、如果MySQL服务故障重启后,因为事务回滚导致异常,可以将参数innodb_force_recovery设置为3跳过回滚阶段
2、如果因为MySQL数据页损坏导致异常,可以使⽤SELECT+WHERE查出未损坏数据并将其通过mysqldump导出。
3、将innodb_force_recovery参数设置⼤于0启动服务后,应通过修改端⼝或域名(VIP)指向来屏蔽应⽤访问。
4、将innodb_force_recovery参数设置⼤于0启动服务后,可以通过mysqlcheck命令来对表进⾏检查/分析/优化/修复。
5、使⽤force_recovery重启服务前,建议对数据库所有⽂件进⾏备份,避免修复过程中对数据进⾏⼆次损害。
在⽇常运维中,应将使⽤innodb_force_recovery参数进⾏数据恢复作为最后⼿段,做好完善的备份恢复机制,避免对数据库做⾼危操作。