← 中文资源

简体中文版本

InnoDB Doublewrite 缓冲

doublewrite 缓冲把脏页写两遍——先写顺序暂存区再写真实位置——崩溃时的撕裂页可用完整副本修复,保障 redo 重放安全。

阅读英文原文

概念定义

InnoDB 以 16KB 页存数据,重放 redo 的前提是页物理完整。断电时操作系统或设备可能撕裂大页写入,留下 redo 无法修复的半旧半新字节。doublewrite 先把每页顺序写入暂存区,再复制到最终位置。

工作机制

刷脏时页面先在 doublewrite 区域顺序落盘,随后再写到真实偏移。恢复时发现撕裂页就从暂存副本还原,然后才做 redo。顺序首遍还把随机页写合并为更大的顺序突发,某些存储执行更快。

使用场景

通用存储上默认开启有其理由。具备原子写的 SSD、提供整页日志的 ZFS 等文件系统,或可接受从副本重建的复制部署,可以评估关闭它——但要同时基准测试写吞吐与崩溃恢复演练。

常见误区

doublewrite 只修复 redo 无法处理的撕裂页,不是泛泛的崩溃保护。代价是真实但有界的顺序写增量,并非总写入翻倍。在 ext4 默认日志配置上关闭它是拿边际收益换真实的损坏风险;任何改动都应以 performance schema 的刷写计数前后对照。