栏目头部广告

MySQL数据库页损坏修复方案

一、 应用场景分析

MySQL数据单机部署的时候,可能会遇到难以预料的故障,如:服务器宕机、服务器掉电等情况,都有可能会导致MySQL数据库的物理文件(.ibd)受损,MySQL数据库无法正常启动,业务中断,并且有丢失数据的风险!!!那么针对这种情况,我们该如何应急恢复呢?今天就和大家分享一下innodb_force_recovery这个参数~

【注】当然生产环境中,建议大家搭建高可用架构的数据库或者搭建主从结构的数据库,最大程度的实现数据库的灾备机制。一旦主库故障,备库或从库能够迅速顶上去,大大缩短业务中断时间。

文章推荐: MySQL主从同步搭建

二、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置于只读模式。

官网介绍:https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_force_recovery

MySQL数据库页损坏修复方案(图1)

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

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

3、innodb_force_recovery=3 ( SRV_FORCE_NO_TRX_UNDO )
在crash recovery之后不执行事务rollbacks。

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

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

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

作者:UStarGao
链接:https://www.starcto.com/mysql/125.html
来源:STARCTO
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处

UCloud云平台推荐


UCloud新用户专属注册连接

UCloud CDN超值特惠专场

UCloud全球云主机(UHost/VPS)大促页面

UCloud快杰云主机大促页面

加载中~
文章详情页广告

随便看看

底部广告
`