记录技术收获,分享个人心得

人生如负重远行,不可急于求成

Mysql启动后自动关闭问题解决(ibdata1损坏)

出现这个问题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

《Mysql启动后自动关闭问题解决(ibdata1损坏)》

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 进行导入

逐个导入数据库完毕后完成重建。至此修复完成。


点赞

发表评论

邮箱地址不会被公开。 必填项已用*标注

hi~

你好,欢迎来到我的博客,欢迎留言。

快速搜索:





Generic selectors

Exact matches only


Search in title


Search in content



Search in posts


Search in pages

欢迎关注我:

微博
steam
网易云音乐
QQ
500px

常用命令:

http://www.gaoshan.me/cmd