diff --git a/mysql/mysql文档/innodb体系结构.md b/mysql/mysql文档/innodb体系结构.md index a669109..308585b 100644 --- a/mysql/mysql文档/innodb体系结构.md +++ b/mysql/mysql文档/innodb体系结构.md @@ -441,3 +441,66 @@ change buffer可以带来更少的磁盘读取和磁盘写入,故而在工作 当change buffer占用了过多buffer pool中内存,导致buffer pool中页面老化速度超出预期时,此时可以尝试将`innodb_change_buffer_max_size`适当调小。 +## double write +double write buffer为存储区域,当innodb将buffer pool中的页刷新到innodb data file中的适当位置之前,会页写入到double write buffer中。 + +如果在写入页面的过程中,发生操作系统、存储子系统、mysql进程的异常,通过double write buffer,在crash recovery的过程中innodb能够从double write buffer中找到page的备份。 + +即使数据写了两次,double write buffer也不会造成两倍的IO负载或两倍的io操作数量。数据按照large chunk的方式写入到double write buffer中,并且会调用`fsync`方法。 + +### double write结构 +double write由两部分组成: +- 内存: double write buffer,位于内存中 +- 磁盘:磁盘中的表空间 + +当innodb刷新buffer pool中的页面时,操作如下: +1. 将页面写入到double write buffer中(其含有128个页),并且在写入到double write buffer后调用`fsync`,确保将double write buffer中的数据刷新到磁盘中 +2. 在完成`1`操作后,会实际将页数据写入到data file磁盘文件中,再次调用`fsync`确保数据被持久化到磁盘中 + +在后续innodb执行recovery操作时,会检查double write buffer中的内容和data file中page的内容: +- 如果double write buffer中内容不一致,那么仅会将double write buffer中的内容丢弃 +- 如果datafile中页内容不一致,那么将会从double write buffer中恢复数据 + +### innodb_doublewrite +`innodb_doublewrite`控制是否启用double write buffer。默认情况下,double write开启。如果想要关闭double write,可以将`innodb_doublewrite`设置为`OFF`. + +#### DETECT_AND_RECOVERY +`DETECT_AND_RECOVERY`和`ON`设置相同,在该设置下,double write被完全启用。innodb将会将page内容写入到double write buffer中,并且在recovery过程中会通过double write buffer中的数据来修复不一致page。 + +#### DETECT_ONLY +当`innodb_doublewrite`被设置为`DETECT_ONLY`时,只有元数据会被写入到double write buffer,数据库的page content并不会被写入到double write buffer中,并且recovery过程也不会用double write buffer中的内容来恢复数据。 + +`DETECT_ONLY`设置只是为了检测`incomplete page write`。 + +> 如果dobule write buffer位于支持`atomic write`的fusion-io设备上,那么double write buffer将会自动被关闭,datafile的写入将会使用`fusion-io atomic write`。 + +### innodb_doublewrite_dir +`innodb_doublewrite_dir`变量定义了innodb创建doublewrite files的位置。如果该变量没有被指定,那么innodb将会把文件创建在`innodb_data_home_dir`。 + +### innodb_doublewrite_pages +`innodb_doublewrite_pages`控制每个线程其doublewrite page的最大数量。 + +### innodb_doublewrite_files +`innodb_doublewrite_files`定义了doublewrite file的文件个数,默认情况下值为2,会为每个buffer pool instance创建两个doublewrite文件: +- flush list doublewrite file +- lru list doublewrite file + +#### flush list dobulewrite file +flush list doublewrite file是用于buffer pool flush list中page的刷新的。flush list doublewrite file的默认大小为`innodb page size * double write pages`。 + +#### lru doublewrite file +lru doublewrite file是用于从buffer pool lru list中刷新的,其默认大小为`innodb page size * (doublewrite pages + (512 / buffer pool instances))`。 + +其中512为slot的总数量。 + +doublewirte file命名格式如下所示: +``` +#ib_page_size_file_number.dblwr +``` + + + + + + +