1.首先查看mysql的日志文件定位问题
报错:InnoDB: Database page corruption on disk or a failed
2.报错原因
数据库中表损坏导致数据访问错误,从而导致数据库崩溃;mysql中check table 发现表有损坏,但表是innodb类型不能修复。
Innodb 自检过程中checksum与退出时不一致便会去recover;
3.报错解决:
a)
方法1: 将data下面的部分文件挪到上一级目录的tmp下,试出出错的文件,发现ib_data1,ib_logfile0 损坏;
没有找到其他更好的方法:
b)
将ib_data1 重新放入data目录下,在my.cnf 中添加
[mysqld] innodb_force_recovery = 6
然后重启mysql,重启成功。此时数据库只能读取,然后使用mysqldump或 pma或navicat for mysql 导出数据;
c)
关闭服务器,将ib_data1 改名为ib_data1_back,在my.cnf 中去掉innodb_force_recovery = 6,重启服务器。
倒入数据即可;
注释:
innodb_force_recovery影响整个InnoDB存储引擎的恢复状况。默认为0,表示当需要恢复时执行所有的恢复操作(即校验数据页/purge undo/insert buffer merge/rolling back&forward),当不能进行有效的恢复操作时,mysql有可能无法启动,并记录错误日志; innodb_force_recovery可以设置为1-6,大的数字包含前面所有数字的影响。当设置参数值大于0后,可以对表进行select,create,drop操作,但insert,update或者delete这类操作是不允许的。 1(SRV_FORCE_IGNORE_CORRUPT):忽略检查到的corrupt页。 2(SRV_FORCE_NO_BACKGROUND):阻止主线程的运行,如主线程需要执行full purge操作,会导致crash。 3(SRV_FORCE_NO_TRX_UNDO):不执行事务回滚操作。 4(SRV_FORCE_NO_IBUF_MERGE):不执行插入缓冲的合并操作。 5(SRV_FORCE_NO_UNDO_LOG_SCAN):不查看重做日志,InnoDB存储引擎会将未提交的事务视为已提交。 6(SRV_FORCE_NO_LOG_REDO):不执行前滚的操作。