doublewrite缓冲区是一个存储区域InnoDB
属性中的适当位置之前,先写入从缓冲池刷新的页InnoDB
数据文件。是否存在操作系统、存储子系统等异常情况mysqld进程在页面中间退出,写入,InnoDB
可以在崩溃恢复期间从doublewrite缓冲区中找到一个良好的页面副本。
虽然数据写入两次,但doublewrite缓冲区并不需要两倍的I/O开销或两倍的I/O操作。数据以一个大的顺序块写入doublewrite缓冲区fsync ()
调用操作系统(除非innodb_flush_method
设置为O_DIRECT_NO_FSYNC
).
在MySQL 8.0.20之前,doublewrite缓冲区的存储区域位于InnoDB
系统表空间。从MySQL 8.0.20开始,doublewrite缓冲区存储区域位于doublewrite文件中。
为doublewrite缓冲区配置提供了以下变量:
的
innodb_doublewrite
变量控制是否启用doublwrite缓冲区。在大多数情况下默认启用。要禁用doublewrite缓冲区,请设置innodb_doublewrite
设置为0或启动服务器——skip-innodb-doublewrite
.如果您更关心性能而不是数据完整性,您可以考虑禁用doublewrite缓冲区,例如,在执行基准测试时可能会出现这种情况。如果doublewrite缓冲区位于支持原子写的Fusion-io设备上,则会自动关闭doublewrite缓冲区,并使用Fusion-io原子写执行数据文件写操作。但是,要注意
innodb_doublewrite
设置是全局的。当禁用doublewrite缓冲区时,所有数据文件(包括不在Fusion-io硬件上的数据文件)都将禁用doublewrite缓冲区。该特性仅在Fusion-io硬件上支持,且仅在Linux下的Fusion-io NVMFS上启用。为了充分利用这一特性,一个innodb_flush_method
设置O_DIRECT
建议。的
innodb_doublewrite_dir
variable(在MySQL 8.0.20中引入)定义了其中的目录InnoDB
创建doublewrite文件。如果未指定目录,则在目录中创建doublewrite文件innodb_data_home_dir
目录,如果未指定,默认为数据目录。哈希符号“#”会自动添加到指定的目录名前,以避免与模式名冲突。然而,如果a '。”、“#”。或者在目录名中显式地指定了'/'前缀,哈希符号'#'没有作为目录名的前缀。
理想情况下,doublewrite目录应该放在可用的最快的存储介质上。
的
innodb_doublewrite_files
变量定义doublewrite文件的数量。默认情况下,为每个缓冲池实例创建两个doublewrite文件:一个flush列表doublewrite文件和一个LRU列表doublewrite文件。刷新列表双写文件用于从缓冲池刷新列表刷新的页面。刷新列表双写文件的默认大小为
InnoDB
页面大小* doublewrite页面字节。LRU列表双写文件用于从缓冲池LRU列表刷新页面。它还包含用于单页刷新的插槽。LRU列表双写文件的默认大小是
InnoDB
页大小* (doublewrite页+(512 /缓冲池实例数)),其中512是为单页刷新预留的插槽总数。至少有两个doublewrite文件。doublewrite文件的最大数量是缓冲池实例数量的两倍。缓冲池实例的数量由
innodb_buffer_pool_instances
变量)。Doublewrite文件名的格式如下:
# ib_
.例如,为MySQL实例创建以下doublewrite文件页大小
_file_number
.dblwrInnoDB
页面大小为16KB和一个缓冲池:# ib_16384_0。dblwr # ib_16384_1.dblwr
的
innodb_doublewrite_files
变量用于高级性能调优。默认设置应该适合大多数用户。的
innodb_doublewrite_pages
variable(在MySQL 8.0.20中引入)控制每个线程的最大双写页面数。如果没有指定值,innodb_doublewrite_pages
设置为innodb_write_io_threads
价值。此变量用于高级性能调优。默认值应该适合大多数用户。的
innodb_doublewrite_batch_size
variable(在MySQL 8.0.20中引入的)控制了批写doublewrite页面的数量。此变量用于高级性能调优。默认值应该适合大多数用户。
从MySQL 8.0.23开始,InnoDB
自动加密属于加密表空间的doublewrite文件页(参见第15.13节“InnoDB静态数据加密”).同样,属于页压缩表空间的doublewrite文件页也被压缩。因此,doublewrite文件可以包含不同的页类型,包括未加密和未压缩的页、加密的页、压缩的页以及既加密又压缩的页。