龙空技术网

浅谈MySQL的Doublewrite

hxliu666 49

前言:

现时看官们对“mysqlasync”都比较注重,兄弟们都想要知道一些“mysqlasync”的相关知识。那么小编在网络上收集了一些有关“mysqlasync””的相关内容,希望咱们能喜欢,各位老铁们快快来学习一下吧!

#MySQL##数据库#

Doublewrite

通俗来讲,Doublewrite是防止数据在落盘到数据文件时,防止整页的数据没有写完全,而这种时候,突然出现异常导致落盘到数据文件中的page 损坏的情况。一旦出现损坏的情况发生,数据库可以根据Doublewrite中的数据来进行损坏页的修复。

Doublewrite 相关参数解释innodb_doublewrite 是否开启doublewrite buffer。此参数不能动态调整。在8.0.30版本以上,新增配置配置值:DETECT_AND_RECOVER 和 DETECT_ONLY。

DETECT_AND_RECOVER 和 ON的参数一样,完整的数据页(content 和 metadata)都会记录到doublewrite。

DETECT_ONLY 仅仅记录metadata到doublewrite

通过上面对新增配置值的简单介绍,可以很清楚的看到,如果我们开启doublewrite的话,如果要在上面的值,2选1的话,一定选择DETECT_AND_RECOVER。因为数据库异常关闭启动的话,可以通过doublewrite来修复损坏的页,而DETECT_ONLY不可以。新增的两个配置值,在doublewrite开启的前提下,可以动态配置。

innodb_doublewrite_dir 手动配置doublewrite file的存放路径。如果不指定的话,则存放在innodb_data_home_dir参数配置的路径下。8.0.20之前是存在系统的表空间里。

innodb_doublewrite_files

默认是由2个文件构成的,分别为 :A flush list doublewrite file and an LRU list doublewrite file。最小的文件数就是2个,最大的文件数和参数”innodb_buffer_pool_instances“有关,是此参数配置值的2倍。

innodb_doublewrite_pages

Defines the maximum number of doublewrite pages per thread for a batch write。如果不配置此参数,此参数的值有参数innodb_write_io_threads的值来决定。

innodb_doublewrite_batch_size

Defines the number of doublewrite pages to write in a batch

后面的三个参数,默认的就是最好的,建议不到万不得已不要去调整。

自己的一些理解

关于Doublewrite的代码部分位于:storage\innobase\buf\buf0dblwr.cc中。

上面图是从官方上的InnoDB Architecture章节的内存和磁盘部分。我们可以看到Doublewrite Buffer FIles。是在磁盘上的一部分。那么我们通常说的Doublewrite Buffer 是它么?属于磁盘的一部分么?

我的答案是不是,我们通常说的Doublewrite Buffer应该是内存中的一部分,默认是64页,每页是16K,64*16=1024K 也就是1M,默认是2个区域,所以是2M。这些可以在源代码中找到相关的值。

默认的命名是怎么取的呢?我的文件是#ib_16384_0.dblwr #ib_16384_1.dblwr这样的,分别代表的意义是什么呢?

通过上面的代码片段,可以很清楚的看到"#ib"是默认的前缀, 后面的16384是默认的页大小,也是参数“innodb_page_size”的值,后面的是文件的ID号,默认为0和1,共2个文件。最后是文件的后缀。

Doublewrite是如何落盘的呢?

Doublewrite buffer,脏页落盘到 doublewrite file ,顺序写,完成后,再根据是sync还是async来把buffer中的脏页写到datafile合适的位置中,这部分写是离散写。

源码中有对应的 函数 write,write_pages、flush_to_disk……

Doublewrite适用于所有场景么?

并不是,如果是要求性能而对数据要求不严格的话,建议关闭。如果对数据要求很高的的话,建议开启。

参考链接:

标签: #mysqlasync