双写缓冲区是一个存储区域,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 数据静态加密”)。同样,属于压缩表空间的双写文件页也被压缩。因此,双写文件可以包含不同的页类型,包括未加密和未压缩的页、加密页、压缩页和同时加密和压缩的页。