https://mp.weixin.qq.com/s/bkoQ9g4cIcFFZBnpVh8ERQ
MySQL的buffer一页的大小为16k,文件系统一页的大小为4k,MySQL把一页的数据刷新到磁盘上需要文件系统4页。
以上操作并不是原子操作。如果执行到一半断电后,数据是会丢失的。页数据会丢失。重启后redo是无法进行修复这类页数据丢失问题的。修复的前提是页数据完整性正常。
MySQL是如果解决这个问题的?
能有一个副本对原来的页数据进行备份。这个存储副本的地方就是“Double writer buffer”.
它与传统的buffer不同,它分为内存和磁盘两部分。
第一步:页数据先memcopy到DWB的内存中。
第二步:DWB内存会刷到DWB磁盘上。(DWB内存只有2M,由128个页组成)
第三步:DWB内存会刷新到数据磁盘上。
DWB要写两次磁盘会不会影响性能?
分析DWB执行的三个步骤:
1).页数据memcopy到DWB的内存,速度很快。
2).DWB内存fsync刷到DWB的磁盘,属于顺序追加写,速度很快。
3).刷磁盘,随机写,本来就需要进行,不属于额外操作。
画外音:
(1)write-ahead-log之所以性能高,就是因为顺序追加写;
(2)有第三方测评,评估约10%性能损失;
结尾
MySQL有很强的数据安全性机制:
(1)在异常崩溃时,如果不出现“页数据损坏”,能够通过redo恢复数据;
(2)在出现“页数据损坏”时,能够通过double write buffer恢复页数据;
double write buffer:
(1)不是一个内存buffer,是一个内存/磁盘两层的结构,是InnoDB里On-Disk架构里很重要的一部分;
(2)是一个通过写两次,保证页完整性的机制;