暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[MySQL]InnoDB两次写的实现机制

数据老匠 2016-05-04
730


        在InnoDB存储引擎中,通过两次写的机制来保障数据写入以及数据恢复时的绝对安全。所谓的两次写,本质上是一种备份安全机制。




什么是两次写?

        两次写的目的是增强数据的可靠性。如果写失效,可以通过重做日志进行恢复,但是重做日志中记录的是对页的物理操作,如果页本身损坏,再对其进行重做是没有意义的。所以,在应用重做日志前,需要一个页的副本,当写入失效发生时,先通过页的副本来还原该页,再进行重做,这就是double wire。也就是恢复数据=页副本+重做日志。

        两次写需要额外添加两个部分:

        1)内存中的两次写缓冲(doublewrite buffer),大小为2MB

        2)磁盘上共享表空间中连续的128页,大小也为2MB

 

两次写的原理是什么?

        1)当刷新缓冲池脏页时,并不直接写到数据文件中,而是先拷贝至内存中的两次写缓冲区。

        2)接着从两次写缓冲区分两次写入磁盘共享表空间中,每次写入1MB

        3)待第2步完成后,再将两次写缓冲区写入数据文件

         这样就可以解决上文提到的部分写失效的问题,因为在磁盘共享表空间中已有数据页副本拷贝,如果数据库在页写入数据文件的过程中宕机,在实例恢复时,可以从共享表空间中找到该页副本,将其拷贝覆盖原有的数据页,再应用重做日志即可。




如何跟踪两次写的执行效果?

        可以查看Innodb的数据库状态来进行跟踪,如:

mysql> show global status like 'innodb_dblwr%'\G

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

Variable_name: Innodb_dblwr_pages_written

               Value: 61932183

*************************** 2. row ***************************

Variable_name: Innodb_dblwr_writes

               Value: 15237891

2 rows in set (0.00 sec)

       以上数据显示,doublewrite一共写了 61932183个页,一共写了15237891次,从这组数据我们可以分析,之前讲过在开启doublewrite后,每次脏页刷新必须要先写doublewrite,而doublewrite存在于磁盘上的是两个连续的区,每个区由连续的页组成,一般情况下一个区最多有64个页,所以一次IO写入应该可以最多写64个页。而根据以上我这个系统Innodb_dblwr_pages_written与Innodb_dblwr_writes的比例来看,大概在4左右,远远还没到64,所以从这个角度也可以看出,系统写入压力并不高。



文章转载自数据老匠,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论