文档主页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  双写缓冲区

17.6.4 双写缓冲区

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

虽然数据被写入两次,但双写缓冲区不需要两倍的 I/O 开销或两倍的 I/O 操作。数据以一个大的顺序块写入到双写缓冲区,并使用单个 fsync() 调用写入到操作系统(除非 innodb_flush_method 设置为 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 设置的动态更改,这些更改在 ONDETECT_AND_RECOVERDETECT_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_doublewrite_dir 变量定义 InnoDB 创建双写文件的目录。如果未指定目录,则双写文件将创建在 innodb_data_home_dir 目录中,该目录在未指定的情况下默认为数据目录。

    指定的目录名称将自动添加一个哈希符号“#”作为前缀,以避免与架构名称冲突。但是,如果在目录名称中显式指定“.”、“#”或“/”前缀,则不会在目录名称前面添加哈希符号“#”。

    理想情况下,双写目录应放置在可用的最快存储介质上。

  • innodb_doublewrite_files

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

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

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

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

    双写文件名具有以下格式:#ib_page_size_file_number.dblwr (或使用 DETECT_ONLY 设置时为 .bdblwr)。例如,对于 InnoDB 页面大小为 16KB 且只有一个缓冲池的 MySQL 实例,会创建以下双写文件

    #ib_16384_0.dblwr
    #ib_16384_1.dblwr

    变量 innodb_doublewrite_files 用于高级性能调优。对于大多数用户来说,默认设置应该足够了。

  • innodb_doublewrite_pages

    变量 innodb_doublewrite_pages 控制每个线程的最大双写页面数。此变量用于高级性能调优。对于大多数用户来说,默认值应该足够了。

InnoDB 会自动加密属于加密表空间的双写文件页面 (请参阅 第 17.13 节,“InnoDB 数据静止加密”)。同样,属于页面压缩表空间的双写文件页面也会被压缩。因此,双写文件可以包含不同的页面类型,包括未加密和未压缩的页面、加密的页面、压缩的页面以及同时被加密和压缩的页面。