Mysql 双写缓冲区
双写缓冲区是一个存储区域,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_RECOVER 和 DETECT_ONLY 设置。
DETECT_AND_RECOVER 设置与 ON 设置相同。在此设置下,双写缓冲区完全启用,数据库页面内容写入双写缓冲区,在恢复期间可访问该缓冲区来修复不完整的页面写入。
在 DETECT_ONLY 设置下,仅将元数据写入双写缓冲区。数据库页面内容不会写入双写缓冲区,恢复过程也不会使用双写缓冲区来修复不完整的页面写入。此轻量级设置仅用于检测不完整的页面写入。
MySQL 支持在启用双写缓冲区的 ON、DETECT_AND_RECOVER 和 DETECT_ONLY 之间动态更改 innodb_doublewrite 设置。MySQL 不支持在启用和禁用双写缓冲区的设置之间进行动态更改,反之亦然。
如果双写缓冲区位于支持原子写入的 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 会自动对属于加密表空间的双写文件页面进行加密。同样,属于页面压缩表空间的双写文件页面也会被压缩。因此,双写文件可以包含不同的页面类型,包括未加密和未压缩的页面、加密的页面、压缩的页面以及既加密又压缩的页面。