有些时候,你的MySQL数据库是单机,没有主从和高可用,如果宕机,或者其它异常情况,导致你的ibd文件损坏,这个时候,你的MySQL数据库实例无法启动了,而你又需要导出MySQL数据库中关键数据,这时innodb_force_recovery参数能救你一命,首先你需要了解innodb_force_recovery作用。

innodb_force_recovery默认为0,innodb_force_recovery可以设置1到6。较大的值包括较小值所有功能。例如,3包含1和2的所有功能。

设置innodb_force_recovery值等于或小于3,MySQL数据库的表是相对安全,此时仅丢失了损坏的单个页面上的某些数据。设置成4或更大的值是非常危险的,此时可能会导致页数据永久损坏。

为保护数据,InnoDB会在innodb_force_recovery大于 0 时阻止INSERT,UPDATE或DELETE操作。innodb_force_recovery设置为 4 或更大时会将InnoDB置于只读模式。

下面来介绍一下innodb_force_recovery设置各种值的作用

innodb_force_recovery=1 ( SRV_FORCE_IGNORE_CORRUPT )

此时MySQL数据库即使检测到损坏的page也可以运行。可以尝试使SELECT * FROM tab跳过损坏的索引记录和页面,可以恢复没有损坏的业务数据。

innodb_force_recovery=2 ( SRV_FORCE_NO_BACKGROUND )

阻止master thread和任何purge threads运行。如果在purge操作期间发生崩溃,则此恢复值将阻止它。

innodb_force_recovery=3 ( SRV_FORCE_NO_TRX_UNDO )

在crash recovery之后不执行事务rollbacks。

innodb_force_recovery=4 ( SRV_FORCE_NO_IBUF_MERGE )

防止insert buffer合并操作,不计算 tablestatistics。此时可能会永久损坏数据文件,需要删除并重新创建所有二级索引。

innodb_force_recovery=5 ( SRV_FORCE_NO_UNDO_LOG_SCAN )

启动数据库时不检查undo logs:InnoDB甚至将未完成的事务都视为已提交。此值可能会永久损坏数据文件。将InnoDB设置为只读。

innodb_force_recovery=6 ( SRV_FORCE_NO_LOG_REDO )

不进行与恢复有关的redo log前滚。此值可能会永久损坏数据文件。使数据库页面处于过时状态,从而可能导致 B 树和其他数据库结构遭受更多破坏。将InnoDB设置为只读。

创建模拟表mysql> show create table t_test\G;

*************************** 1. row ***************************

Table: t_test

Create Table: CREATE TABLE `t_test` (

`id` int(10) unsigned NOT NULL AUTO_INCREMENT,

`k` int(12) unsigned NOT NULL DEFAULT '0',

`c` char(120) NOT NULL DEFAULT '',

`pad` char(60) NOT NULL DEFAULT '',

`paymont` double(10,2) DEFAULT NULL,

PRIMARY KEY (`id`),

KEY `k_1` (`k`)

) ENGINE=InnoDB AUTO_INCREMENT=10002 DEFAULT CHARSET=utf8 MAX_ROWS=1000000

1 row in set (0.00 sec)

mysql> select * from t_test;

+----+---------+-------------+-------------+-----------+

| id | k | c | pad | paymont |

+----+---------+-------------+-------------+-----------+

| 1 | 4992833 | 83868641912 | 67847967377 | 200000.00 |

| 2 | 5019684 | 38014276128 | 23183251411 | NULL |

| 3 | 5042604 | 33973744704 | 38615512647 | NULL |

| 4 | 5020133 | 37002370280 | 63947013338 | NULL |

| 5 | 4998122 | 44257470806 | 34551750492 | NULL |

| 6 | 5005844 | 37216201353 | 05161542529 | NULL |

| 7 | 5013709 | 33071042495 | 91798303270 | NULL |

| 8 | 4999376 | 73754818686 | 76460662325 | NULL |

| 9 | 5272683 | 26482547570 | 30508501104 | NULL |

| 10 | 5033749 | 05677017559 | 29489382504 | NULL |

| 11 | 5495590 | 69916792160 | 87387995487 | NULL |

| 12 | 4877585 | 06636928111 | 89292458800 | NULL |

+----+---------+-------------+-------------+-----------+

12 rows in set (0.00 sec)

模拟表的页损坏

要模拟t_test表页损坏,其实很简单,可以通过vi工具,在t_test.ibd文件开始行添加N个!就可以

重启MySQL服务

模拟损坏之后,就重启MySQL数据库实例,同时看MySQL数据库错误日志2020-09-01T12:58:25.207448Z 0 [Note] InnoDB: Loading buffer pool(s) from u02/log/3308/iblog/ib_buffer_pool

2020-09-01T12:58:25.209575Z 0 [ERROR] InnoDB: Space ID in fsp header is 134217728, but in the page header it is 660067840.

2020-09-01T12:58:25.331762Z 0 [ERROR] [FATAL] InnoDB: Tablespace id is 48 in the data dictionary but in file ./sbtest/t_test.ibd it is 18446744073709551615!

2020-09-01 20:58:25 0x7ffb8d022700 InnoDB: Assertion failure in thread 140718379247360 in file ut0ut.cc line 942

InnoDB: We intentionally generate a memory trap.

InnoDB: Submit a detailed bug report to http://bugs.mysql.com.

InnoDB: If you get repeated assertion failures or crashes, even

InnoDB: immediately after the mysqld startup, there may be

InnoDB: corruption in the InnoDB tablespace. Please refer to

InnoDB: http://dev.mysql.com/doc/refman/5.7/en/forcing-innodb-recovery.html

InnoDB: about forcing recovery.

看到没,此时数据库实例已经无法正常启动了,原因是因为t_test.ibd文件头部记录的Tablespace id与数据字典不一致。怎么办

设置innodb_force_recovery

因为此时t_test.ibd文件头部记录的Tablespace id与数据字典不一致,只能在my.cnf文件中添加innodb_force_recovery=4,然后启动MySQL数据库实例mysql> show tables;

+------------------+

| Tables_in_sbtest |

+------------------+

| sbtest1 |

| t_pay_test |

| t_test |

+------------------+

3 rows in set (0.00 sec)

mysql> select * from t_test;

ERROR 1812 (HY000): Tablespace is missing for table `sbtest`.`t_test`.

mysql>

mysql> drop table t_test;

Query OK, 0 rows affected (0.02 sec)

由于此时已经无法识别t_test.ibd文件了,此时只能drop掉t_test表了。

如果只是损坏了页数据,可以用下面的sql语句恢复业务数据insert ignore into t_test_recovery select * from t_test limit 5;

insert ignore into t_test_recovery select * from t_test limit 10;

什么是页损坏 mysql_MySQL数据库页损坏怎么办,innodb_force_recovery参数帮你解决问题...相关推荐

  1. MySQL数据库页损坏怎么办,innodb_force_recovery参数帮你解决问题

    MySQL数据库页损坏怎么办,innodb_force_recovery参数帮你解决问题 有些时候,你的MySQL数据库是单机,没有主从和高可用,如果宕机,或者其它异常情况,导致你的ibd文件损坏,这 ...

  2. 系统损坏 mysql_mysql数据库损坏修复方法(适用window、Linux系统vps云主机)

    网站访问提示mysql错误:Table XXX is marked as crashed and should be repaired 修复方法如下: 一.管理助手方式: 打开管理助手,打开mysql ...

  3. java数据库损坏_数据库表损坏的修复

    网站访问mysql出现错误: load() - DBD::mysql::st execute failed: Table './test/test_user' is marked as crashed ...

  4. brighthouse mysql_MySQL 数据库中的数据页合并-爱可生

    原标题:MySQL 数据库中的数据页合并-爱可生 MySQL InnoDB 表数据页或者二级索引页(简称数据页或者索引页)的合并与分裂对 InnoDB 表整体性能影响很大:数据页的这类操作越多,对 I ...

  5. SQL数据库无法附加 系统表损坏修复 数据库中病毒解密恢复

    SQL数据库无法附加 系统表损坏修复 数据库中病毒解密恢复 开发此工具是为了 让手工恢复数据库物理故障时 更加简单便捷直观, 本工具用于物理修复独立处理大部分问题以及与DBCC配合完成修复各种数据库错 ...

  6. mysql innodb表损坏_MySQL数据库INNODB表损坏修复处理过程分享

    ##状况描述 突然收到MySQL报警,从库的数据库挂了,一直在不停的重启,打开错误日志,发现有张表坏了.innodb表损坏不能通过repair table 等修复myisam的命令操作.现在记录下解决 ...

  7. 系统损坏sql数据库备份_如何识别损坏SQL备份文件

    系统损坏sql数据库备份 A Database administrator's key task is to keep the database healthy and available for t ...

  8. [InnoDB] #CORRUPT LOG RECORD FOUND#[MySQL InnoDB表空损坏,数据库无法启动]#

    1.写在前面(具体报错)信息 # MySQL Version :8.0.27 MySQL Community Server - GPL #有很多类似这样的报错,我这里截取了完整的一段 [root@zb ...

  9. 数据库文件损坏修复实战笔记

    今天终于碰到数据库文件头pfs损坏的案例. 环境:win server 2008+sql 2008 R2 SP2 问题描述:db某些page损坏 问题定位:  1.执行DBCC CHECKDB(DB, ...

最新文章

  1. Enterprise Architect 7 入门教程 1
  2. java office 集成开发_Office文件格式突变,促使Java和Office更完美集成
  3. javascript移动端 电子书 翻页效果
  4. python 笔记:爱因斯坦求和 einsum
  5. QT的QMutableMapIterator类的使用
  6. js继承之借用构造函数继承
  7. oracle中通过游标实现查询
  8. vaOJ10369 - Arctic Network
  9. laravel的路由分组,中间件,命名空间,子域名,路由前缀(四)
  10. 英特尔CEO重申全球性芯片短缺需要数年才能解决
  11. centos无法使用ifconfig命令,安装方法
  12. 微信小程序:wx.getUserInfo 接口的变动与使用
  13. vs2013 资源视图 看不到东西
  14. 《JAVA程序设计基础(第3版)实验指导》pdf 附下载链接
  15. deepin linux 安装jdk,deepin安装JDK
  16. IDEA 打开窗口切换的快捷键
  17. Windows命令行解决8080端口被占用
  18. 在PyCharm中大型数据集indexing...加载缓慢的问题
  19. 解决Error: Assertion failed (chunk.m_size <= 0xFFFF)和Set OPENCV_ENABLE_NONFREE CMake option问题
  20. Windows Server 2008密码破解

热门文章

  1. Linux服务之SSH
  2. 【EWM系列】SAP EWM WCU和Non-SAP系统接口
  3. atitit. hb 原生sql跨数据库解决原理 获得hb 数据库类型执行期获得Dialect
  4. 后台数据库优化——板机
  5. URL不能过长,否则summit方法提交失败
  6. python __slots__ [转]
  7. ​​An Image is Worth 16x16 Words,那么一个视频是什么呢?阿里达摩院用STAM给你答案!...
  8. CVPR2021 P2GAN:提高图像风格迁移的鲁棒性
  9. OpenVINO 部署 Mask-RCNN 实例分割
  10. 30-80k/月!影创科技算法岗招聘,含实习生