作者:断翅的雨蝶1 | 来源:互联网 | 2024-12-22 19:39
本文深入探讨了MySQLInnoDB存储引擎的DoubleWrite技术,该技术通过在内存和磁盘上创建数据页的副本,确保了部分写失效(PartialPageWrite)情况下的数据完整性和可靠性。同时,文章介绍了InnoDB以页为单位进行读取和更新的机制,并详细解析了DoubleWrite的工作原理。
基础概念
InnoDB存储引擎的数据读取和更新是以页(通常为16KB)为单位进行的,而不是以行为单位。每次需要操作的数据会先以页的形式加载到内存中。被修改过的内存页被称为脏页(Dirty Page)。这些脏页不会立即刷新到磁盘,而是通过fsync函数调用时才会同步到磁盘。
Double Write机制
Double Write是InnoDB存储引擎为了确保数据页可靠性而引入的技术。它解决了部分写失效问题,即当数据库宕机时,某个页可能只写入了一部分数据,导致数据不完整或损坏。
在未使用Double Write之前,曾出现过因部分写失效而导致的数据丢失情况。虽然可以通过重做日志(Redo Log)恢复数据,但如果页本身已经损坏,重做日志将无法修复。因此,InnoDB引入了Double Write技术,在写入数据前先保存一个完整的页副本,以便在发生部分写失效时能够恢复原始页。
Double Write由两部分组成:内存中的Double Write Buffer(大小为2MB)和磁盘上的共享表空间中连续的128个页(同样为2MB)。当脏页需要刷新到磁盘时,首先会被复制到内存中的Double Write Buffer,然后分两次顺序写入共享表空间的物理磁盘,并立即调用fsync函数同步数据。
由于Double Write页是连续的且采用顺序写入方式,因此写入开销较小。完成Double Write页的写入后,再将这些页分散写入各个表空间文件中。
总结
为了确保数据库宕机时不丢失数据,InnoDB采用了Double Write技术。其工作流程如下:
- 将脏页复制到内存中的Double Write Buffer(高效内存复制);
- 将Double Write Buffer分两次顺序写入共享表空间(高效顺序写入);
- 立刻调用fsync函数将数据同步到磁盘。
如果在执行第三步时发生宕机事件,恢复过程如下:
- 从共享表空间中找到对应脏页的副本;
- 将其复制到表空间文件;
- 应用重做日志(Redo Log)。