Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

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 设置,以启用双写缓冲区,between 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 定义了双写文件的数量。默认情况下,为每个缓冲池实例创建两个双写文件:一个 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 设置)。例如,对于具有 16KB InnoDB 页大小和单个缓冲池的 MySQL 实例,创建了以下双写文件:

    #ib_16384_0.dblwr
    #ib_16384_1.dblwr

    变量 innodb_doublewrite_files旨在高级性能调整。默认设置应该适合大多数用户。

  • innodb_doublewrite_pages

    变量 innodb_doublewrite_pages 控制每个线程的最大双写页数。如果未指定值,则 innodb_doublewrite_pages 将设置为 innodb_write_io_threads 值。该变量旨在高级性能调整。默认值应该适合大多数用户。

  • innodb_doublewrite_batch_size

    变量 innodb_doublewrite_batch_size 控制批量写入双写页的数量。该变量旨在高级性能调整。默认值应该适合大多数用户。

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