https://dev.mysql.com/doc/refman/5.7/en/forcing-innodb-recovery.html
线上测试服务器做主从备份,结果从服务器异常崩溃启动,导致数据库坏掉了。然后从服务器的数据库无法启动。我们需要先把数据库起来。
innodb_force_recovery是用来强制回复innodb数据库的,有6个有效配置。默认是0,大于0表示对应的恢复等级,0表示不启用强制恢复。
4或者更高的数字会永久的修改当前的文件内容。建议在恢复之前做好备份。当强制恢复是,最好是从1开始,然后不断增加数字。
更高的数字包含低数字的功能,比如3包含所有1和2的功能。
如果使用3或者更低的数字,那么你只会丢失一小部分错误的数据。如果使用4或者更高的数字,是非常危险的,因为数据文件会被永久的污染。6表示极端的,因为这种模式下数据页被认为是过时的,这样反过来可能对B树和数据结构造成更大的损坏。
作为安全考虑,InnoDB会禁止INSERT, UPDATE, or DELETE操作在innodb_force_recovery大于0的时候。对于4或者更高的等级会设置为只读模式。
- 1 (SRV_FORCE_IGNORE_CORRUPT)
是服务器运行直到检测出错误的页。尝试使SELECT * FROM tbl_name跳到正确的索引位置和页。对于dump表很有用。
- 2 (SRV_FORCE_NO_BACKGROUND)
禁止master线程和清理线程运行。如果一个未预料的退出来自于清理操作,这个模式会禁止它。
- 3 (SRV_FORCE_NO_TRX_UNDO)
不运行事务回滚在恢复崩溃的时候
- 4 (SRV_FORCE_NO_IBUF_MERGE)
禁止插入缓冲合并操作。如果发生崩溃,就不执行这些操作。不计算表的统计。这个数值会永久修改数据文件。用了这个数值后,需要删除所有的二级索引并且重新创建。设置InnoDB为只读模式。
- 5 (SRV_FORCE_NO_UNDO_LOG_SCAN)
不查看undo日志:InnoDB把所有未完成的事务当作已经提交。这个数值会永久修改数据文件。设置InnoDB为只读模式。
- 6 (SRV_FORCE_NO_LOG_REDO)
不执行redo日志和回滚操作在恢复模式下链接时。这个数值会永久修改数据文件。使数据也为废弃状态,会反过来损坏更多的B树和数据结构。设置InnoDB只读。
你可以SELECT from tables然后dump它们。使用3或者更小的数值,可以DROP或CREATE表。在MySQL 5.7.17版本后DROP TABLE也同样在高于3的等级上支持。作为MySQL 5.7.18,DROP TABLE不允许在高于4的等级上使用。
如果你知道,给定的表,因为一个未知的错误退出了回滚,你可以删除它。如果你遇到了大规模的因为导入或者修改表而导致的回滚错误,你可以停止mysqld的进程,然后把innodb_force_recovery设置为3,使得数据库起来,而不回滚,然后删除导致回滚失败的表格。
如果错误出现在表格的数据中,禁止你dump整个表的内容,可以使用ORDER BY primary_key DESC查询,导出从错误到现在的数据。
如果启动更高的数值,可能导致一些复杂的查询语句失败,比如(queries containing WHERE, ORDER BY, or other clauses)。这时候,你只能使用SELECT * FROM t基础的查询语句了