MySQL 的两次写(Doublewrite)机制是 InnoDB 为保证数据页写入磁盘的原子性而设计的。当脏页刷盘时,InnoDB 会先将数据页复制到内存中的 Doublewrite Buffer,再顺序写入共享表空间中预留的 doublewrite 区域(磁盘),确认写入成功后才将数据页随机写入真正的数据文件(如 .ibd 文件)。
如果写数据文件时发生宕机,InnoDB 可通过 doublewrite 区域中完整的页副本进行恢复,避免页部分写入导致的数据损坏。而 Redo Log 则用于记录物理修改操作,确保事务持久性。两者结合实现了数据页写入的可靠性与事务的崩溃恢复能力:Redo Log 负责“写了什么”,Doublewrite Buffer 负责“写得完整”。