出现这个问题windows和linux都有可能发生,一般发生在服务器意外断电,磁盘异常的情况下,首先需要查询mysql错误日志进行分析
(linux下解决方案见文:http://www.gaoshan.me/website/databases/mysql/centos-rebuild-ibdata1.html)
1、问题还原
在服务器一次断电后出现该现象,重启mysql无法启动,检查错误日志,核心的几个报错如下
InnoDB: Assertion failure in thread 139743447295744 in file trx0purge.cc line 840
InnoDB: Failing assertion: purge_sys->iter.trx_no <= purge_sys->rseg->last_trx_no
InnoDB: Doing recovery: scanned up to log sequence number 20293596130
2、问题特征
尝试改名ib_logfile0和ib_logfile1后,重启mysql后可能会提示成功,但是查看端口后发现mysql没有运行,启动后立即停止,也可能出现报错无法启动。错误日志中无某个库或者某张表的ibd文件损坏问题。符合上面特征以及报错日志匹配的,基本可诊断为ibdata1文件损坏。
3、处理方案
因为innodb的核心文件已损坏,需要重建所有数据库,正确的处理流程如下:
(1)复制一份data目录(mysql数据目录)用做备份,以便接下来的操作可以不用担心数据不可回滚
(2)先将所有数据用innodb的恢复模式6来导出,并且记录数据库名
修改/etc/my.cnf(linux) my.ini(windows)
增加innodb_force_recovery=6到配置文件中
启动mysql,使用命令
mysqldump -uroot -p密码 数据库名 > sql备份目录/数据库名.sql
将数据库逐个导出为sql脚本,并且记录下数据库名
(3)drop所有库
导出为sql备份后,使用mysql -u -p登录数据库,drop database 数据库名 dorp掉所有的库
(4)停止mysql服务,删除异常的ibdata1文件,将innodb_force_recovery=6从mysql的配置文件中注释掉
(5)重启mysql,ibdata1文件会自动创建上,此时库中无任何数据
(6)使用mysql -u -p登录数据库,逐个新建数据库,之后再逐个导入备份的sql脚本。
可使用mysql -uroot -p密码 –default-character-set=utf8 数据库名 < sql备份目录/数据库名.sql 进行导入
逐个导入数据库完毕后完成重建。至此修复完成。