两次写
2017-03-27 11:47
134 查看
MySQL的Innodb doublewrite buffer来龙去脉
乍一看文档上写的Innodb有个doublewrite buffer,从我们dba的角度一下认为可能是一块内存区域
用来存放某种缓存的数据类型.但是恰恰这个doublewrite buffer是一种比较特殊的buffer,事实上这个buffer
并不是一块内存区域,而是存放在表空间中或是单独指定的某个文件中的一个buffer.
我们来看os写文件的写机制, 在mysql中,每次写数据(仅数据文件)到磁盘中的时候是以page作为单位的.
一般都是采用的是16KB大小,可以在数据库初始化的时候使用innodb_page_size来定义.
mysql> show global variables like '%innodb_page_size%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| innodb_page_size | 16384 |
+------------------+-------+
1 row in set (0.00 sec)
而在os级别写文件是以4KB作为单位的,那么每写一个innodb的page到磁盘上,在os级别上需要写4个块.通过以下
命令可以查看文件系统的块大小.
[root@localhost ~]# dumpe2fs /dev/sda7 | grep "Block size"
dumpe2fs 1.39 (29-May-2006)
Block size: 4096
当mysql在写一个innodb page到磁盘上时,如果在写这个page的过程中发生了意外的事件,比如断电,mysql崩溃等
就会使这个page数据出现不一样的情形.从而形成一个"断裂"的page.使数据产生混乱.这个时候innodb对这种块错误错误是无
能为力的.
通过引入doublewrite buffer的方案,每次innodb在准备写出一个page时,先把page写到doublewrite buffer中.如果在写
doublewrite buffer时,发生了意外,但是数据文件中的原来的page不受影响,这样在下次启动时,可以通过innodb的redolog
进行恢复.如果在写doublewrite buffer成功后,mysql会把doublewrite buffer的内容写到数据文件中,如果在这个过程又出现了
意外,没有关系,重启后mysql可以通过从doublewrite buffer找到好的page,再用该好的page去覆盖磁盘上坏的page即可.
所以在正常的情况下,mysql写数据page时,会写两遍到磁盘上,第一遍是写到doublewrite buffer,第二遍是从doublewrite buffer
写到真正的数据文件中.
在某些情况下可以关闭doublewrite buffer,从而提高性能,比如比较稳定的系统中,有比较好的主从备份等.
主要的控制参数如下:
mysql> show global variables like '%innodb_doublewrite%';
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| innodb_doublewrite | ON |
| innodb_doublewrite_file | |
+-------------------------+-------+
2 rows in set (0.00 sec)
innodb_doublewrite 控制是否开启doublewrite ,默认是on;innodb_doublewrite_file定义doublewrite存放的位置,如果不定
义就会存放系统表空间中.
乍一看文档上写的Innodb有个doublewrite buffer,从我们dba的角度一下认为可能是一块内存区域
用来存放某种缓存的数据类型.但是恰恰这个doublewrite buffer是一种比较特殊的buffer,事实上这个buffer
并不是一块内存区域,而是存放在表空间中或是单独指定的某个文件中的一个buffer.
我们来看os写文件的写机制, 在mysql中,每次写数据(仅数据文件)到磁盘中的时候是以page作为单位的.
一般都是采用的是16KB大小,可以在数据库初始化的时候使用innodb_page_size来定义.
mysql> show global variables like '%innodb_page_size%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| innodb_page_size | 16384 |
+------------------+-------+
1 row in set (0.00 sec)
而在os级别写文件是以4KB作为单位的,那么每写一个innodb的page到磁盘上,在os级别上需要写4个块.通过以下
命令可以查看文件系统的块大小.
[root@localhost ~]# dumpe2fs /dev/sda7 | grep "Block size"
dumpe2fs 1.39 (29-May-2006)
Block size: 4096
当mysql在写一个innodb page到磁盘上时,如果在写这个page的过程中发生了意外的事件,比如断电,mysql崩溃等
就会使这个page数据出现不一样的情形.从而形成一个"断裂"的page.使数据产生混乱.这个时候innodb对这种块错误错误是无
能为力的.
通过引入doublewrite buffer的方案,每次innodb在准备写出一个page时,先把page写到doublewrite buffer中.如果在写
doublewrite buffer时,发生了意外,但是数据文件中的原来的page不受影响,这样在下次启动时,可以通过innodb的redolog
进行恢复.如果在写doublewrite buffer成功后,mysql会把doublewrite buffer的内容写到数据文件中,如果在这个过程又出现了
意外,没有关系,重启后mysql可以通过从doublewrite buffer找到好的page,再用该好的page去覆盖磁盘上坏的page即可.
所以在正常的情况下,mysql写数据page时,会写两遍到磁盘上,第一遍是写到doublewrite buffer,第二遍是从doublewrite buffer
写到真正的数据文件中.
在某些情况下可以关闭doublewrite buffer,从而提高性能,比如比较稳定的系统中,有比较好的主从备份等.
主要的控制参数如下:
mysql> show global variables like '%innodb_doublewrite%';
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| innodb_doublewrite | ON |
| innodb_doublewrite_file | |
+-------------------------+-------+
2 rows in set (0.00 sec)
innodb_doublewrite 控制是否开启doublewrite ,默认是on;innodb_doublewrite_file定义doublewrite存放的位置,如果不定
义就会存放系统表空间中.
相关文章推荐
- EditText中onEditorAction监听事件执行两次
- TCP 为什么是三次握手,为什么不是两次或四次?
- 剑指offer--之字符串中先出现两次的字符
- 统计第一个只出现两次的字符
- 点击返回键 两次退出APP
- Invitation Cards(两次spfa)
- android设置软键盘搜索键以及监听搜索键点击时发生两次事件的问题解决
- 编译环境和打包环境的问题、logback打印两次的问题、Jersey入参和出参
- poj2185 Milking Grid(两次KMP)
- TCP/IP连接为什么要三次握手,而不是两次
- Android 实现点击两次BACK键退出应用
- SPOJ - PHRASES Relevant Phrases of Annihilation (n个字符串中求至少出现两次且不重叠的最长子串)
- 两次写
- 两次调用encodeURI来解决乱码问题(通过encodeURI解决乱码问题)
- 关于react组件渲染两次的问题
- 关于MVC刷新页面会两次请求页面的原因
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 找出这两个数字,编程实现
- SVN 的使用:用两次就会了,很简单.注意总结【①做完自己代码,首先右键项目>team >“与资源库同步”,把队友的代码更新下来(而不是直接提交),②整合完设置"冲突已解决",才能提交】===
- Tomcat启动时项目重复加载,导致资源初始化两次的问题
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。