MySQL 的 Doublewrite Buffer 是什么?它有什么作用?
MySQL 的 Doublewrite Buffer 是什么?它有什么作用?
回答重点
MySQL 的 Doublewrite Buffer 是 InnoDB 存储引擎中的一个机制,用于确保数据的安全性和一致性。其作用是将数据首先写入一个内存缓冲区(双写缓冲区),然后再将其写入数据文件。这种方式可以防止在写入过程中因崩溃或故障导致数据损坏,确保数据的一致性和完整性。
工作原理简述:
- 写入流程:当事务提交时,InnoDB 首先将数据写入 Doublewrite Buffer,再从该缓冲区将数据写入磁盘的实际数据文件。
- 恢复机制:在崩溃恢复时,InnoDB 会使用 Doublewrite Buffer 中的数据来修复损坏的页,保证数据不丢失。
扩展知识
进一步理解 Doublewrite Buffer
我们都知道 innodb 默认一页是 16K,而操作系统 Linux 内存页是 4K,那么一个 innodb 页对应 4 个系统页。
所以 innodb 的一页数据要刷盘等于需要写四个系统页,假设 innodb一页数据落盘的时候,只写了一个系统页就断电了,那 innodb 一页数据就坏了,这就完了,不好恢复不了。
即产生了部分页面写问题,因为写 innodb 的一页无法保证原子性,所以引入了 Doublewrite Buffer。
其实就是当 innodb 要将数据落盘的时候,先将页数据拷贝到 Doublewrite Buffer 中,然后 Doublewrite Buffer 再刷盘到 Doublewrite Buffer Files,这时候等于数据已经落盘备份了。
然后再将数据页刷盘到本该到文件上。
从这个步骤我们得知,数据是写了两次磁盘,所以这东西叫 double write。
之所以这样操作就是先找个地方暂存这次刷盘的完整数据,如果出现断电这种情况导致的部分页面写而损坏原先的完整页,可以从 Doublewrite Buffer Files 恢复数据。
但虽然是两次写,性能的话也不会低太多,因此数据拷贝到 Doublewrite Buffer 是内存拷贝操作,然后写到 Doublewrite Buffer Files 也是批量写,且是顺序写盘,所以对整体而已,性能损失不会太多。
有了这个 buffer,在崩溃恢复的时候,如果发现页损坏,就可以从 Doublewrite Buffer Files 里面找到页副本,然后恢复即可。
Doublewrite Buffer 工作原理简述:
1)写入 Doublewrite Buffer
当 InnoDB 需要将脏页(dirty page,即已被修改但尚未写入磁盘的页)写入磁盘时,首先将这些数据页写入到 Doublewrite Buffer 中。
2)写入实际数据文件:
将数据页写入 Doublewrite Buffer 和落盘后,InnoDB 将这些数据页从 Doublewrite Buffer 写入到实际的数据文件中(如 .ibd 文件)。
3)如果发生部分写的情况:
数据页写入一半断电了,在崩溃恢复的时候,InnoDB 会检查 Doublewrite Buffer 中的数据页。如果在系统崩溃前数据页已经成功写入 Doublewrite Buffer,那么这些数据页是完整和一致的。
从 Doublewrite Buffer 中将完整的页重新写入实际数据文件,修复受影响的页。
Doublewrite Buffer 通常在系统表空间文件(ibdata1)中,分为两个 1MB 的区域,共 2MB,每个区域可存储 64 个 16KB 的页。