Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


17.6.4 双写缓冲区

双写缓冲区是一个存储区域,InnoDB 在将缓冲池中的页面刷新到InnoDB 数据文件的正确位置之前,将其写入其中。如果在写入页面时出现操作系统、存储子系统或mysqld进程意外退出,InnoDB 可以在崩溃恢复中从双写缓冲区中找到页面的良好副本。

虽然数据被写入两次,但双写缓冲区不需要两倍的I/O开销或两倍的I/O操作。数据被写入双写缓冲区中的一大块顺序 chunk 中,使用单个fsync()调用到操作系统(except in the case that innodb_flush_method is set to O_DIRECT_NO_FSYNC)。

双写缓冲区存储区域位于双写文件中。

以下变量用于配置双写缓冲区:

  • innodb_doublewrite

    innodb_doublewrite变量控制是否启用双写缓冲区。默认情况下,在大多数情况下启用双写缓冲区。要禁用双写缓冲区,请将innodb_doublewrite设置为OFF。如果您更关心性能,而不是数据完整性,例如在进行基准测试时,可以考虑禁用双写缓冲区。

    innodb_doublewrite支持DETECT_AND_RECOVERDETECT_ONLY设置。

    DETECT_AND_RECOVER设置与ON设置相同。使用该设置时,双写缓冲区完全启用,数据库页面内容将被写入到双写缓冲区中,并在恢复过程中访问该缓冲区以修复不完整的页面写入。

    使用DETECT_ONLY设置时,只有元数据将被写入到双写缓冲区中。数据库页面内容不会被写入到双写缓冲区中,并且恢复过程中也不会使用双写缓冲区来修复不完整的页面写入。这是一个轻量级的设置,旨在仅检测不完整的页面写入。

    MySQL支持将innodb_doublewrite设置从ON、DETECT_AND_RECOVER和DETECT_ONLY之间进行动态更改。MySQL不支持在启用双写缓冲区的设置与OFF或vice versa之间进行动态更改。

    如果双写缓冲区位于支持原子写入的Fusion-io设备上,那么双写缓冲区将自动禁用,并使用Fusion-io原子写入来执行数据文件写操作。然而,请注意innodb_ doublewrite设置是全局的。当双写缓冲区被禁用时,它将对所有数据文件进行禁用,包括不位于Fusion-io硬件上的文件。这一特性仅在Fusion-io硬件上支持,并且仅在Linux上支持Fusion-io NVMFS。为了充分利用该特性,建议设置innodb_flush_methodO_ DIRECT

  • innodb_doublewrite_dir

    变量innodb_doublewrite_dir定义了InnoDB创建双写文件的目录。如果未指定目录,双写文件将在innodb_data_home_dir目录下创建,该目录默认为数据目录如果未指定。

    自动添加一个哈希符号'#'到指定目录名称以避免与模式名称冲突。然而,如果在目录名称中显式指定了 '.'、'#'或 '/' 前缀,那么不添加哈希符号'#'到目录名称中。

    理想情况下,双写目录应该位于可用的最快存储介质上。

  • innodb_doublewrite_files

    变量innodb_doublewrite_files定义了双写文件的数量,默认为2。默认情况下,每个缓冲池实例都会创建两个双写文件:flush列表双写文件和LRU列表双写文件。

    flush列表双写文件用于从缓冲池 flush 列表中刷新页面。flush 列表双写文件的默认大小为InnoDB页面大小 * 双写页面字节。

    LRU 列表双写文件用于从缓冲池 LRU 列表中刷新页面。它还包含单个页面刷新槽位。LRU 列表双写文件的默认大小为InnoDB页面大小 * (双写页面 + (512 / 缓冲池实例数量)),其中 512 是reserved 单个页面刷新槽位的总数。

    最少有两个双写文件。最大双写文件数量是缓冲池实例数量的两倍。(缓冲池实例数量由变量innodb_buffer_pool_instances控制。)

    双写文件名具有以下格式:#ib_page_ size_file_number.dblwr(或.bdblwr with the DETECT_ONLY setting)。例如,对于具有16KBInnoDB页面大小和单个缓冲池的 MySQL 实例,以下双写文件将被创建:

    #ib_16384_0.dblwr
    #ib_16384_1.dblwr

    innodb_doublewrite_files 变量是高级性能调整的目标。默认设置通常适用于大多数用户。

  • innodb_doublewrite_pages

    innodb_doublewrite_pages 变量控制每个线程的最大双写页数。这一变量是高级性能调整的目标。默认值通常适用于大多数用户。

  • innodb_doublewrite_batch_size

    innodb_doublewrite_batch_size 变量控制批处理中的双写页数。这一变量是高级性能调整的目标。默认值通常适用于大多数用户。

InnoDB 自动将属于加密表空间的双写文件页进行加密(见第17.13节,“InnoDB Data-at-Rest Encryption”)。同样,属于页面压缩表空间的双写文件页将被压缩。因此,双写文件可能包含不同类型的页,包括未加密和未压缩的页、加密页、压缩页和同时加密和压缩的页。