双写缓冲区是一个存储区域,InnoDB
在将页面从缓冲池刷新到其在 InnoDB
数据文件中的适当位置之前,将页面写入该区域。如果在页面写入过程中出现操作系统、存储子系统或意外的 mysqld 进程退出,InnoDB
可以在崩溃恢复期间从双写缓冲区中找到页面的良好副本。
尽管数据被写入两次,但双写缓冲区并不需要两倍的 I/O 开销或两倍的 I/O 操作。数据以大块的顺序块形式写入双写缓冲区,仅需一个 fsync()
调用到操作系统(除非 innodb_flush_method
设置为 O_DIRECT_NO_FSYNC
)。
双写缓冲区存储区域位于双写文件中。
以下变量用于双写缓冲区配置:
-
变量
innodb_doublewrite
控制双写缓冲区是否启用。默认情况下,在大多数情况下启用双写缓冲区。要禁用双写缓冲区,请将innodb_doublewrite
设置为OFF
。如果您更关心性能而不是数据完整性,例如在执行基准测试时,可以禁用双写缓冲区。innodb_doublewrite
支持DETECT_AND_RECOVER
和DETECT_ONLY
设置。设置
DETECT_AND_RECOVER
与设置ON
相同。使用此设置,双写缓冲区完全启用,数据库页面内容写入双写缓冲区,在恢复期间用于修复不完整的页面写入。使用设置
DETECT_ONLY
,仅写入元数据到双写缓冲区。数据库页面内容不写入双写缓冲区,恢复不使用双写缓冲区来修复不完整的页面写入。此轻量级设置仅用于检测不完整的页面写入。MySQL 支持动态更改
innodb_doublewrite
设置,以启用双写缓冲区,betweenON
、DETECT_AND_RECOVER
和DETECT_ONLY
。MySQL 不支持动态更改双写缓冲区启用设置和OFF
之间的设置。如果双写缓冲区位于支持原子写入的 Fusion-io 设备上,双写缓冲区将自动禁用,并使用 Fusion-io 原子写入代替数据文件写入。然而,请注意
innodb_doublewrite
设置是全局的。当双写缓冲区被禁用时,它将对所有数据文件禁用,包括不在 Fusion-io 硬件上的文件。该功能仅在 Fusion-io 硬件上支持,并且仅在 Linux 上的 Fusion-io NVMFS 上启用。要充分利用该功能,建议将innodb_flush_method
设置为O_DIRECT
。 -
变量
innodb_doublewrite_dir
定义了InnoDB
创建双写文件的目录。如果未指定目录,双写文件将创建在innodb_data_home_dir
目录中,该目录默认为数据目录,如果未指定。一个哈希符号 '#' 将自动添加到指定的目录名称,以避免与模式名称冲突。但是,如果目录名称中明确指定了 '.'、'#' 或 '/' 前缀,则不会添加哈希符号 '#'。
理想情况下,双写目录应该位于最快的存储介质上。
-
变量
innodb_doublewrite_files
定义了双写文件的数量。默认情况下,为每个缓冲池实例创建两个双写文件:一个 flush 列表双写文件和一个 LRU 列表双写文件。flush 列表双写文件用于从缓冲池 flush 列表中刷新的页面。默认情况下,flush 列表双写文件的大小是
InnoDB
页大小 * 双写页字节。LRU 列表双写文件用于从缓冲池 LRU 列表中刷新的页面。它还包含单页刷新的插槽。默认情况下,LRU 列表双写文件的大小是
InnoDB
页大小 * (双写页 + (512 / 缓冲池实例数)),其中 512 是为单页刷新保留的总插槽数。至少有两个双写文件。双写文件的最大数量是缓冲池实例数的两倍。(缓冲池实例数由
innodb_buffer_pool_instances
变量控制。)双写文件名具有以下格式:
#ib_
(或page_size
_file_number
.dblwr.bdblwr
使用DETECT_ONLY
设置)。例如,对于具有 16KBInnoDB
页大小和单个缓冲池的 MySQL 实例,创建了以下双写文件:#ib_16384_0.dblwr #ib_16384_1.dblwr
变量
innodb_doublewrite_files
旨在高级性能调整。默认设置应该适合大多数用户。 -
变量
innodb_doublewrite_pages
控制每个线程的最大双写页数。如果未指定值,则innodb_doublewrite_pages
将设置为innodb_write_io_threads
值。该变量旨在高级性能调整。默认值应该适合大多数用户。 -
变量
innodb_doublewrite_batch_size
控制批量写入双写页的数量。该变量旨在高级性能调整。默认值应该适合大多数用户。
InnoDB
自动加密属于加密表空间的双写文件页(参见 第 17.13 节,“InnoDB 数据静态加密”)。同样,属于压缩表空间的双写文件页也被压缩。因此,双写文件可以包含不同的页类型,包括未加密和未压缩的页、加密页、压缩页和同时加密和压缩的页。