为你解密InnoDB是如何解决写失效问题

今天同大家分享一个mysql的知识点,Double write buffer。

1.Double write buffer是干什么的?

为了解决写失效问题,实现InnoDB引擎数据页的可靠性

既然是实现数据页的可靠性,那么就必然存在数据页不可靠的情况,那么这种情况是什么呢?就让我们先了解下partial page write(部分页失效)的问题。

2.partial page write(部分页失效)

我们都知道InnoDB中,每个PageSize的大小是16KB,但是操作系统的页大小是4KB,当我们读取InnoDB数据页数据的时候,我们是以每次4KB的大小去读取数据的,那么就会存在当我们在写数据的时候,数据页刚写了8KB的数据,突然宕机了,那么就会有8KB的数据丢失,这就是写失效问题。

在这里插入图片描述

3.那么Double Write是如何解决写失效的问题呢?

我们先来看下Double Write的执行流程,如下图所示:
在这里插入图片描述
1.当我们的Buffer Pool中出现脏页,会首先将脏页数据同步到Log Buffer中。
2.之后就会通过一个函数将脏页数据复制一份放到Double Write Buffer(2M)中。
3.Double Write Buffer会将数据顺序写入磁盘里共享表空间中ibdata文件中的double write空间内(每块大小1M)
4.第一次写完之后,Double Write Buffer会马上调用fsync函数,再将数据写入到独立表空间的数据文件中,也就是.ibd文件中。
5.这两步都写完之后,才会将Log Buffer中的数据同步到Redo Log文件中。

Double Write Buffer之所以写两次,而不是直接写到独立表空间中,是因为共享表空间的ibdata文件专门划出了两块连续的空间,这样Double Write Buffer在写入数据的时候,是顺序写入,效率是非常高的,这样能最快的将数据写入到磁盘中。

有了这样的双写机制之后,如果操作系统在写数据页到磁盘的中途再发生宕机,那么InnoDB就可以从共享表空间中已有的数据副本,将page页数据还原,然后再应用Redo log进行重做,这就是double write。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值