06.InnoDB引擎之-两次写机制原理(double write)

参考文章:

作用

double write(两次写)使数据页更可靠。

当InnoDB存储引擎正在向磁盘写入数据页时(16KB的数据页只写入了前4KB),这时发生宕机,这种情况称为部分写失效(partial page write)。如果没有double write(两次写)机制,那么会造成数据丢失的情况。

double write(两次写)正是用来解决上述问题而设计的。

说明:数据页默认为16KB,文件系统一页默认大小为4KB。

原理

如上图所示,double write(两次写)由两部分组成,一部分是内存中的double write buffer ,大小2MB;另一部分是物理磁盘上共享空间中连续的128个页,即2个区,大小2MB。在对缓冲池的脏页刷新时,经过如下步骤:

  1. 先通过memcpy函数将脏页先复制到double write buffer中
  2. 然后每次以1MB大小顺序写入共享表空间的物理磁盘上(因为该空间维护的是128个连续页,最小16KB,所以不会出现部分写失效情况)
  3. 马上调用fsync函数同步磁盘
  4. 如果在同步磁盘的过程中发生崩溃,InnoDB存储引擎从共享表空间中doublewrite中找到该页的一个副本,将其复制到表空间文件
  5. 然后再应用重做日志,更新数据页。

PS:总结到这里我有个疑问,在同步磁盘时宕机的问题是解决了,那么如果写入double write共享表空间时宕机,那么数据是不是就丢失了呢?

经过不断的查看资料、思考终于想通了,答案当然是不会丢失。有这个疑问说明对InnoDB存储引擎的整体运行机制的细节不了解导致,具体详解往下看。


  1. 第一步,对数据页数据进行更新
  2. 第二步,向redo log buffer中记录redo log
  3. 第三步,将缓存中的redo log写入磁盘
  4. 第四步,将脏页复制到double write buffer中
  5. 第五步,将数据页写入到共享表空间(维护的是128个连续页,最小16KB)
  6. 第六步,马上调用fsync函数同步磁盘
  7. 第七步,当第六步执行一半时发生宕机,执行恢复操作,InnoDB存储引擎从共享表空间中doublewrite中找到该页的一个副本,将其复制到表空间文件。
  8. 如果在执行第五步时,有些数据页还没写入共享表空间就宕机了,那么此时磁盘中就丢失了该数据页,这时就需要靠redo log来恢复数据了。
  9. 第八步,重启服务,根据redo log文件向缓存池中加载数据页,以一个数据页LSN=1000为例子,该数据页时更新之前的,在redo log中该数据页LSN=1100。
  10. 第九步,比较redo log与数据页的LSN大小 redo log lsn > page lsn,需要更新数据页,更新完成后该数据页为脏页。
  11. 此时重复第四步,将脏页复制到double write buffer中
  12. 继续重复后面所有步骤。

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值