关的快还是开的快?细数innodb_fast_shutdown和innodb_force_recovery的优与劣(更新中)

MySQL在启动的时候,会进行前滚(利用redo log实现)和回滚(利用undo log和bin log实现)事物,来保证与前一次数据库服务关闭前的数据版本的最终一致性。

Crash Recovery的过程,可查阅参考文档一。

我们知道,不同的落盘机制影响着redo、undo、binlog以及数据本身的刷新策略。

1、Redo log

innodb_log_buffer_size控制着redo log的缓冲池大小,线程:master therad、参数:innodb_flush_log_at_trx_commit、以及缓存池的剩余容量触发(1/2大小)同时控制着redo log落盘的频率

2、Undo log

每做一次记录的修改操作,都会伴随着undo log的产生,修改操作所在的事物提交后,如果undo log不再被其他事物引用,就会被purge掉(正常情况下,会定期删除那些标记为删除并且不再被MVCC或rollback需要的undo页)。

注:insert操作的undo可以在所在事物提交后立即删除。相反,update和delete则仍然需要在一段时间内保存undo

3、binlog

sync_binlog,innodb_flush_log_at_trx_commit 控制着事物提交是如何影响binlog落盘的。

而innodb_support_xa同时限制着redo log和binlog。

4、Data

BP中脏页的刷新,在关闭时,由innodb_fast_shutdown控制。

innodb_fast_shutdown决定了InnoDB在关闭时需要做那些事情,可选取值:0、1、2

0、对所有undo页进行purge(数据库重启意味着所有的undo页都变为无用的了),对change buffer进行merge,刷新BP中的脏页。称之为“slow shutdown”或者“clean shutdown”,可能会耗费几分钟,甚至几小时。在进行MySQL大版本升降级时,需要如此设置。

1、默认值。在=0的操作的基础上,跳过那些一定要flush的操作(certain flush operations)仅刷新脏页,称之为“fast shutdown”。

2、不刷新BP中的脏页到磁盘上,仅刷新redo log buffer之后就直接shutdown,就好似MySQL是crash掉的。(下次重启时将会耗时在crash recovery的过程中)。一般用于紧急情况下,需要尽快关机的情况。

由于模式0在数据库重启时,不需要做crash recovery,所以启动速度是最快的;而模式1需要做少量的crash recovery,速度适中;反观模式2,则要耗费大量的时间在这个过程上。

总结如下:

取值purge allmerge change bufferflush dirty pages
0
1××
2××仅flush redo log buffer

 

innodb_force_recovery决定了InnoDB在开启时需要做那些事情,可选取值:0~6。默认0

 

 

参考文档:

InnoDB recovery详细流程

InnoDB crash recovery speed in MySQL 5.6

MySQL · 引擎特性 · InnoDB崩溃恢复

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值