主博客:
【MySQL精通之路】InnoDB(6)-磁盘上的InnoDB结构-CSDN博客
上一篇:
【MySQL精通之路】磁盘上的InnoDB结构-表空间-CSDN博客
下一篇:
【MySQL精通之路】InnoDB(6)-磁盘上的InnoDB结构-Redolog-CSDN博客
目录
1.介绍
1.1 配置变量
1.1.1 innodb_doublewrite
1.1.2 innodb_doublewrite_dir
1.1.3 innodb_doublewrite_files
1.1.4 innodb_doublewrite_pages
1.1.5 innodb_doublewrite_batch_size
1.介绍
双写缓冲区是一个存储区域,在将页面写入InnoDB数据文件中的适当位置之前,InnoDB会在其中写入从缓冲池中刷新的页面。
如果在页面写入过程中出现操作系统、存储子系统或意外的mysqld进程退出,InnoDB可以在崩溃恢复期间从双写缓冲区中找到页面的良好副本。
尽管数据写入两次,但双写缓冲区不需要两倍的I/O开销或两倍的输入/输出操作。
通过对操作系统的单个fsync()调用,将数据写入大的顺序块中的双写缓冲区(顺序写)
(innodb_flush_method设置为O_DIRECT_NO_FSYNC的情况除外)。
在MySQL 8.0.20之前,双写缓冲区存储区域位于InnoDB系统表空间中。
从MySQL 8.0.20开始,双写缓冲区存储区域位于双写文件中。
1.1 配置变量
为双写缓冲区配置提供了以下变量:
1.1.1 innodb_doublewrite
innodb_doublewrite变量控制是否启用双写缓冲区。
在大多数情况下,它是默认启用的。
要禁用双写缓冲区,请将innodb_doublewrite设置为OFF。
如果您更关心性能而不是数据完整性,请考虑禁用双写缓冲器,例如在执行基准测试时可能会出现这种情况。
从MySQL 8.0.30开始,innodb_doublewrite支持DETECT_AND_RECOVER和DETECT_ONLY设置。
DETECT_AND_RECOVER
有了此设置,双写缓冲区将完全启用,数据库页面内容将写入双写缓冲区时进行访问,以修复不完整的页面写入。
DETECT_ONLY
只有元数据被写入双写缓冲区。数据库页面内容未写入双写缓冲区,恢复不使用双写缓冲区时修复不完整的页面写入。此轻量级设置仅用于检测不完整的页面写入。
MySQL 8.0.30以后版本支持对innodb_doublewrite设置的动态更改,该设置可在ON、DETECT_AND_RECOVER和DETECT_ONLY之间启用双写缓冲区。MySQL不支持在启用双写缓冲区的设置和OFF之间进行动态更改,反之亦然。
如果双写缓冲区位于支持原子写入的Fusion io设备上,则会自动禁用双写缓冲区时,而是使用Fusion io原子写入执行数据文件写入。
但是,请注意innodb_doublewrite设置是全局设置。
禁用双写缓冲区时,将禁用所有数据文件的双写缓冲区,包括不位于Fusion io硬件上的数据文件。此功能仅在Fusion io硬件上受支持,并且仅在Linux上为Fusion io NVMFS启用。为了充分利用此功能,建议将innodb_flush_method设置为O_DIRECT。
1.1.2 innodb_doublewrite_dir
innodb_doublewrite_dir变量(在MySQL 8.0.20中引入)定义了innodb创建doublewrite文件的目录。如果未指定目录,则在innodb_data_home_dir目录中创建双写文件,如果未指定,则默认为数据目录。
哈希符号“#”会自动作为指定目录名的前缀,以避免与架构名称冲突。但是,如果是“.”,则为“#”。或者在目录名中显式指定了“/”前缀,则哈希符号“#”不会作为目录名的前缀。
理想情况下,双写目录应该放在可用的最快存储介质上。
1.1.3 innodb_doublewrite_files
innodb_doublewrite_files变量定义了双写文件的数量。
默认情况下,为每个缓冲池实例创建两个双写文件:一个刷新列表双写文件和一个LRU列表双写。
刷新列表双写文件用于从缓冲池刷新列表中刷新的页面。
刷新列表双写文件的默认大小是 InnoDB页面大小 x 双写页面字节。
LRU列表双写文件用于从缓冲池LRU列表中刷新的页面。它还包含用于单页刷新的插槽。
LRU列表双写文件的默认大小为 InnoDB页面大小 x(双写页面+(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变量用于高级性能调优。默认设置应该适合大多数用户。
1.1.4 innodb_doublewrite_pages
innodb_doublewrite_pages变量(在MySQL 8.0.20中引入)控制每个线程的最大doublewrite页面数。如果未指定任何值,则将innodb_doublewrite_pages设置为innodb_write_io_threads值。此变量用于高级性能调整。默认值应该适合大多数用户。
1.1.5 innodb_doublewrite_batch_size
innodb_doublewrite_batch_size变量(在MySQL 8.0.20中引入)控制一个批中要写入的双写页面的数量。此变量用于高级性能调整。默认值应该适合大多数用户。
从MySQL 8.0.23开始,InnoDB会自动加密属于加密表空间的双写文件页
(请参见“InnoDB静止数据加密”)。
同样,属于页面压缩表空间的双写文件页面也会被压缩。因此,双写文件可以包含不同的页面类型,包括未加密和未压缩的页面、加密的页面、压缩的页面以及加密和压缩的页面。