欢迎您来到,码代码-李雷博客        登录  |  注册

MySQL崩溃-如何修复损坏的innodb:innodb_force_recovery

更新:2019-03-15 13:52:48
人气:792
来源:互联网转载
A+

一、问题描述

今天在线运行的一个mysql崩溃了,重启后发现还是无法正常启动。

查看错误日志,如下:

2018-08-20 10:19:16 7740 [Note] InnoDB: Page size:8192 Pages to analyze:8

2018-08-20 10:19:16 7740 [Note] InnoDB: Page size: 8192, Possible space_id count:0

2018-08-20 10:19:16 7740 [Note] InnoDB: Page size:16384 Pages to analyze:4

2018-08-20 10:19:16 7740 [Note] InnoDB: Page size: 16384, Possible space_id count:0

2018-08-20 10:19:16 7fdb72c8b740  InnoDB: Operating system error number 2 in a file operation.

InnoDB: The error means the system cannot find the path specified.

InnoDB: If you are installing InnoDB, remember that you must create

InnoDB: directories yourself, InnoDB does not create them.

InnoDB: Error: could not open single-table tablespace file ./data_dep/report.ibd

InnoDB: We do not continue the crash recovery, because the table may become

InnoDB: corrupt if we cannot apply the log records in the InnoDB log to it.

InnoDB: To fix the problem and start mysqld:

InnoDB: 1) If there is a permission problem in the file and mysqld cannot

InnoDB: open the file, you should modify the permissions.

InnoDB: 2) If the table is not needed, or you can restore it from a backup,

InnoDB: then you can remove the .ibd file, and InnoDB will do a normal

InnoDB: crash recovery and ignore that table.

InnoDB: 3) If the file system or the disk is broken, and you cannot remove

InnoDB: the .ibd file, you can set innodb_force_recovery > 0 in my.cnf

InnoDB: and force InnoDB to continue crash recovery here.

180820 10:19:16 mysqld_safe mysqld from pid file /opt/mysqldata/bidw.pid ended

二、问题分析

1、从日志中可以看出是innodb引擎出了问题。日志里提示到 Error: could not open single-table tablespace file ./data_dep/report.ibd ,通过这个报错信息可以判断出来,mysql丢失这个数据文件,或者是该数据文件损坏,当mysql启动的时候检测有问题,将进行恢复,提示正常恢复该数据文件,

2、日志中也提供了解决方法,有强制恢复的方法。在mysql的配置文件my.cnf里找到 [mysqld]字段下,添加 innodb_force_recovery=1:

my.cnf代码如下:

[mysqld]

innodb_force_recovery = 1

innodb_force_recovery参数说明:

如果innodb_force_recovery = 1不生效,则可尝试2——6几个数字

然后重启mysql,重启成功。然后使用mysqldump或 pma 导出数据,执行修复操作等。修复完成后,把该参数注释掉,还原默认值0。

配置文件的参数:innodb_force_recovery

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):不执行前滚的操作

注:当前进行innodb_force_recovery设置为1时启动mysql数据库,在数据恢复后,需要再innodb_force_recovery修改正常模式,也就是innodb_force_recovery=0,数据恢复方案可以参考第三步:方案解析(方法来源网友测试方案)

三、方案解析(恢复丢失数据测试参考)

一般修复方法参考:

第一种方法

建立一张新表:

create table demo_bak  #和原表结构一样,只是把INNODB改成了MYISAM。

把数据导进去

insert into demo_bak select * from demo;

删除掉原表:

drop table demo;

注释掉 innodb_force_recovery 之后,重启。

重命名:

rename table demo_bak to demo;

最后改回存储引擎:

alter table demo engine = innodb

第二种方法

另一个方法是使用mysqldump将表格导出,然后再导回到InnoDB表中。这两种方法的结果是相同的。

备份导出(包括结构和数据):

mysqldump -uroot -p123 test > test.sql

还原方法1:

use test;

source test.sql

还原方法2(系统命令行):

mysql -uroot -p123 test < test.sql;

注意,CHECK TABLE命令在InnoDB数据库中基本上是没有用的。

第三种方法

1、配置my.cnf

配置innodb_force_recovery = 1或2——6几个数字,重启MySQL

2、导出数据脚本

mysqldump -uroot -p123 test > test.sql

导出SQL脚本。或者用Navicat将所有数据库/表导入到其他服务器的数据库中。

注意:这里的数据一定要备份成功。然后删除原数据库中的数据。

3、删除ib_logfile0、ib_logfile1、ibdata1

备份MySQL数据目录下的ib_logfile0、ib_logfile1、ibdata1三个文件,然后将这三个文件删除

4、配置my.cnf

将my.cnf中innodb_force_recovery = 1或2——6几个数字这行配置删除或者配置为innodb_force_recovery = 0,重启MySQL服务

5、将数据导入MySQL数据库

mysql -uroot -p123 test < test.sql; 或者用Navicat将备份的数据导入到数据库中。

此种方法下要注意的问题:

  1、ib_logfile0、ib_logfile1、ibdata1这三个文件一定要先备份后删除;

  2、一定要确认原数据导出成功了

  3、当数据导出成功后,删除原数据库中的数据时,如果提示不能删除,可在命令行进入MySQL的数据目录,手动删除相关数据库的文件夹或者数据库文件夹下的数据表文件,前提是数据一定导出或备份成功。

打赏

取消

感谢您的支持,我会继续努力的!

扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

推荐的文章
# 发表我的评论
  /     /  
# 最近评论
暂时还没有评论,要不要说点什么?
网站地图
会员服务
关于我们
QQ:858353007
 
广告服务
关注微信
手机访问
 
 
Copyright © 2014-2019 www.mdaima.com All Rights Reserved.
版权所有:码代码-李雷博客 | 专注PHP技术经验教程分享!   ICP备案号:京ICP备10202169号