14.6.5 Doublewrite 缓冲区

doublewrite 缓冲区是一个存储区域,其中InnoDB在将页面写入InnoDB数据文件中的适当位置之前,先写入从缓冲池刷新的页面。如果在页面写入过程中发生 os,存储子系统或mysqld进程崩溃,则InnoDB可以在崩溃恢复期间从 doublewrite 缓冲区中找到该页面的良好副本。

尽管数据被写入两次,但双写缓冲区不需要两倍的 I/O 开销或两倍的 I/O 操作。只需对 os 进行一次fsync()调用,就可以将数据按较大的 Sequences 块写入 Doublewrite 缓冲区(除非将innodb_flush_method设置为O_DIRECT_NO_FSYNC)。

在大多数情况下,默认情况下会启用双写缓冲区。要禁用双写缓冲区,请将innodb_doublewrite设置为 0.

如果系统 table 空间文件(“ ibdata 文件”)位于支持原子写的 Fusion-io 设备上,则会自动禁用双写缓冲,并且将 Fusion-io 原子写用于所有数据文件。由于 doublewrite 缓冲区设置是全局的,因此,对于非 Fusion-io 硬件上驻留的数据文件,也禁用 doublewrite 缓冲。此功能仅在 Fusion-io 硬件上受支持,并且仅在 Linux 上的 Fusion-io NVMFS 中启用。要充分利用此功能,建议将innodb_flush_method设置为O_DIRECT