【mysql】Innodb三大特性之double write

1、doublewrite buffermysql官方的介绍

InnoDB uses a novel file flush technique called doublewrite. Before writing pages to the data files, InnoDB first writes them to a contiguous area called the doublewrite buffer. Only after the write and the flush to the doublewrite buffer have completed, does InnoDB write the pages to their proper positions in the data file. If there is an operating system, storage subsystem, or mysqld process crash in the middle of a page write, InnoDB can later find a good copy of the page from the doublewrite buffer during crash recovery.

Although data is always written twice, the doublewrite buffer does not require twice as much I/O overhead or twice as many I/O operations. Data is written to the buffer itself as a large sequential chunk, with a single fsync() call to the operating system.

To turn off the doublewrite buffer, specify the option innodb_doublewrite=0.

2、partial page write

 

数据库,OS和磁盘读写的基本单位是块,也可以称之为(page size)block size。

数据库的块一般为8K,16K;而OS的块则一般为4K;IO块则更小,linux内核要求IO block size<=OS block size。

磁盘IO除了IO block size,还有一个概念是扇区(IO sector),扇区是磁盘物理操作的基本单位,而IO 块是磁盘操作的逻辑单位,一个IO块对应一个或多个扇区,扇区大小一般为512个字节。

所以各个块大小的关系可以梳理如下:

 

DB block > OS block >= IO block > 磁盘 sector,而且他们之间保持了整数倍的关系。比如我的系统各个块的大小如下,DB以mysql为例,OS以linux为例

DB block size

mysql> show variables like 'innodb_page_size';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| innodb_page_size | 16384 |
+------------------+-------+

OS block

[root@dev ~]# getconf PAGESIZE
4096

IO block size

[root@dev ~]# blockdev --getbsz /dev/sda1 
1024

sector size 

[root@dev ~]# fdisk -l | grep Sector
Sector size (logical/physical): 512 bytes / 512 bytes

从上面的结果可以看到DB page=4*OS page=16*IO page=32*sector size

由于任何DB page的写入,最终都会转为sector的写入,如果在写磁盘的过程中,出现异常重启,就可能会发生一个DB页只写了部分sector到磁盘,进而出现页断裂的情况 

 

InnoDB 的Page Size一般是16KB,其数据校验也是针对这16KB来计算的,将数据写入到磁盘是以Page为单位进行操作的。而计算机硬件和操作系统,在极端情况下 (比如断电)往往并不能保证这一操作的原子性,16K的数据,写入4K 时,发生了系统断电/os crash ,只有一部分写是成功的,这种情况下就是 partial page write 问题。

很多DBA 会想到系统恢复后,MySQL 可以根据redo log 进行恢复,而mysql在恢复的过程中是检查page的checksum,checksum就是pgae的最后事务号,发生partial page write 问题时,page已经损坏,找不到该page中的事务号,就无法恢复

所以说,当page 损坏之后,其实应用redo是没有意义的,这时候无法使用redo来恢复,因为原始页已经损坏了,会发生数据丢失。

3、doublewrite

在InnoDB将BP中的Dirty Page刷(flush)到磁盘上时,首先会将(memcpy函数)Page刷到InnoDB tablespace的一个区域中,我们称该区域为Double write Buffer(大小为2MB,每次写入1MB,128个页)。在向Double write Buffer写入成功后,第二步、再将数据拷贝到数据文件对应的位置

当第二步过程中发生故障,也就是发生partial page write的问题。恢复的时候先检查页内的checksum是否相同,不一致,则直接从doublewrite中恢复

1)如果写dw buffer失败,那么这些数据不会写到磁盘,innodb会载入磁盘原始数据和redo日志比较,并重新刷到dw buffer。
2)如果写dw buffer成功,但是刷新到磁盘失败,那么innodb就不会通过事务日志来恢复了,而是直接刷新dw buffer中的数据。

4、对性能的影响

系统需要将数据写两份,一般认为,Double Write是会降低系统性能的。peter猜测可能会有5-10%的性能损失,但是因为实现了数据的一致,是值得的。Mark Callaghan认为这应该是存储层面应该解决的问题,放在数据库层面无疑是牺牲了很多性能的。

事实上,Double Write对性能影响并没有你想象(写两遍性能应该降低了50%吧?)的那么大。在BP中一次性往往会有很多的Dirty Page同时被flush,Double Write则把这些写操作,由随机写转化为了顺序写。而在Double Write的第二个阶段,因为Double Write Buffer中积累了很多Dirty Page,所以向真正的数据文件中写数据的时候,可能有很多写操作可以合并,这样有可能会降低Fsync的调用次数。

基于上面的原因,Double Write并没有想象的那么糟。另外,Dimitri在测试后,发现打开和关闭Double Write对效率的影响并不大。

5、doublewrite参数

mysql> show variables like "%double%";
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| innodb_doublewrite | ON    |
+--------------------+-------+
1 row in set (0.00 sec)mysql> SHOW STATUS LIKE "%innodb_dblwr%";
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Innodb_dblwr_pages_written | 447   |
| Innodb_dblwr_writes        | 38    |
+----------------------------+-------+
2 rows in set (0.00 sec)

从上面可以看出, Flush了447次到doublewrite buffer中,写文件共38次,则每次write合并了447/38次flush

 

参考文章

http://www.percona.com/blog/2006/08/04/innodb-double-write/
http://www.percona.com/doc/percona-server/5.5/performance/innodb_doublewrite_path.html?id=percona-server:features:percona_innodb_doublewrite_path
http://dev.mysql.com/doc/refman/5.0/en/innodb-disk-io.html
http://www.mysqlperformanceblog.com/2006/08/04/innodb-double-write/
http://www.facebook.com/note.php?note_id=107329775932
http://dimitrik.free.fr/blog/archives/2009/08/entry_86.html
http://www.cnblogs.com/cchust/p/3961260.html

 

转载于:https://www.cnblogs.com/chenpingzhao/p/4876282.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/397410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android crop 大图,com.android.camera.action.CROP 实现图片剪裁

APP 中选取图片之后&#xff0c;有时候需要进行剪裁&#xff0c;比如头像。以下是启动代码。在我的项目中&#xff0c;传的是 filePath&#xff0c;所以我转了一下&#xff0c;但实际上从相册选择图片后&#xff0c;用 data.getData() 就可获得 uri。Uri uri Uri.fromFile(new…

Who Gets the Most Candies? POJ - 2886 (线段树)

按顺时针给出n个小孩&#xff0c;n个小孩每个人都有一个纸&#xff0c;然后每个人都有一个val&#xff0c;这个val等于自己的因子数&#xff0c;如果这个val是正的&#xff0c;那就顺时针的第val个孩子出去&#xff0c;如果是负的话&#xff0c;就逆时针的第val个孩子出去&…

javax.validation.ValidationException: Unable to find a default provider

2019独角兽企业重金招聘Python工程师标准>>> [ERROR] [2016-11-16 13:58:21 602] [main] (FrameworkServlet.java:457) Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name org.springframewo…

第十章练习题----2

package com.Hanqi2;public class xitizhuhanshu {public static void main(String[] args) {// TODO Auto-generated method stubxiti tm new xiti("黑色","15寸");xitizhs tm3 new xitizhs("蓝色","15寸");tm.Call("654"…

关于微信“被返回页”在被返回时自动刷新

网上有很多这些文章&#xff0c;但我觉得没一篇真正解决这个问题&#xff0c;倒是能给人一个解决方案的思路&#xff0c;对&#xff0c;就是posState事件。 要解决这个问题也不难&#xff0c;使用history的replaceState属性替换当前网页链接&#xff08;其实作用是在不增加hist…

android视频播放器api,03.视频播放器Api说明

03.视频播放器Api说明目录介绍01.最简单的播放02.如何切换视频内核03.切换视频模式04.切换视频清晰度05.视频播放监听06.列表中播放处理07.悬浮窗口播放08.其他重要功能Api09.播放多个视频10.VideoPlayer相关Api11.Controller相关Api12.边播放边缓存api13.类似抖音视频预加载14…

使用Python重命名MP3标签

从Window复制MP3文件的到Ubuntu下&#xff0c;MP3标签很多是乱码。于是想自己写个Python程序处理一下。 从酷狗复制过来的音乐文件名都是“作者 - 标题”&#xff0c;所以可以通过解析文件名直接获取作者和标题信息。 需要下载eyeD3模块 $ sudo apt-get install python-eyed3 代…

Taurus.MVC 2.0 开源发布:WebAPI开发教程

背景&#xff1a; 有用户反映&#xff0c;Tausus.MVC 能写WebAPI么&#xff1f; 能&#xff01; 教程呢&#xff1f; 嗯&#xff0c;木有&#xff01; 好吧&#xff0c;刚好2.0出来&#xff0c;就带上WEBAPI教程了&#xff01; 开源地址&#xff1a; https://github.com/cyq116…

android 锁屏 home,android 锁屏界面禁用长按home 和menu(recent apps)

android 5.1 系统中public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {//检查当前是否锁屏&#xff0c; 可以添加getTopApp()判断当前activity 来屏蔽2398 final boolean keyguardOn keyguardOn();添加新的方法&#xff1a;//获…

Chrome浏览器调试踩坑

Chrome浏览器若在响应式状态下&#xff0c;页面缩放比例不是100%&#xff0c;元素会“窜位”&#xff0c;点击元素会点击到元素周围的元素 Chrome页面缩放比例不为100%时&#xff0c;table的单元格就算没有边框&#xff08;CSS去掉了&#xff09;也会显示出边框&#xff08;缝隙…

WordPress 博客文章时间格式the_time()设置

国外设计的WordPress 主题里的文章的时间格式是类似“十一月 21, 2010”这种格式的&#xff0c;而中国人习惯的是年在前&#xff0c;月紧跟其后&#xff0c;日在末尾&#xff0c;所以看国外的就显得很别扭&#xff0c;但是我们可以通过修改WP时间代码来设置成为我们中国人习惯的…

linux yum

更改linux YUM源方法&#xff1a;第一步&#xff1a;进入yum配置文件目录&#xff1a;cd /etc/yum.repos.d/第二步&#xff1a;备份配置文件&#xff1a;mv CentOS-Base.repo CentOS-Base.repo.bak第三步&#xff1a;下载网易的配置&#xff08;或其他源配置文件&#xff09;&a…

chrome瀏覽器去掉緩存的方法

方法一&#xff1a; 1.開發說打開開發者工具 勾選這個訪問可以 方法二: commandshiftR 转载于:https://www.cnblogs.com/kaibindirver/p/9378572.html

Apache Tomcat目录下各个文件夹的作用

1.bin&#xff1a;存放各种不同平台开启与关闭Tomcat的脚本文件。 2.lib&#xff1a;存tomcat与web应用的Jar包。 3.conf&#xff1a;存放tomcat的配置文件。 4.webapps&#xff1a;web应用的发布目录。 5.work&#xff1a;tomcat把由各种jsp生成的servlet文件存放的地方。 6.l…

sony z2 android 5.0,索尼Xperia Z2 5.0 root教程_索尼Z2获取5.0系统的root

来说一下咱们的索尼Xperia Z2手机的5.0系统的root&#xff0c;因为现在很多机友的系统是5.0的&#xff0c;可是对于5.0的系统很多机友还不知道如何进行root操作&#xff0c;之前的针对4.4的系统的root方法肯定是用不到5.0的系统上的&#xff0c;因此需要专门的针对5.0的root软件…

ABP文档 - Javascript Api - AJAX

本节内容&#xff1a; AJAX操作相关问题ABP的方式 AJAX 返回信息处理错误 HTTP 状态码WrapResult和DontWrapResult特性 Asp.net Mvc 控制器Asp.net Web Api 控制器动态Web Api层Asp.net Core 控制器动态Web Api层AJAX操作相关问题 执行一个AJAX调用在现在的应用里非常常见&…

视达配色教程17 灰色的色彩意象是什么

视达配色教程17 灰色的色彩意象是什么 一、总结 一句话总结&#xff1a;没有个性的色彩 1、灰色的一般意象是什么&#xff1f; 所有混沌的情感不友好的色彩可怕、恐怖和残忍感情贫乏或者内向年龄和年老遗忘的过去贫困与谦虚劣等的颜色秘密与非法合适的中等-男式时装的标准 二、…

AngularJs 相应回车事件

最近做项目&#xff0c;要用到AngularJs&#xff0c;之前也有用过一点点&#xff0c;但仅限于数据的绑定&#xff0c;这次项目要整个前端需要使用这个框架&#xff0c;可能是不熟悉的原因&#xff0c;感觉这代码搞起来非常的不便利&#xff0c;&#xff1b;现总结一个响应回车事…

android6流畅,Android应用流畅(Seamlessness)设计

即使你的应用程序是快速且响应灵敏的&#xff0c;但一些设计仍然会给用户造成问题——与其它应用程序或对话框未事先计划的交互&#xff0c;意外的数据丢失&#xff0c;意料之外的阻塞等 等。避免这些问题&#xff0c;有助于理解应用程序运行的上下文和系统的交互过程&#xff…

stack overflow--技术问答网站

转自&#xff1a;http://baike.baidu.com/link?urleMR6Pwdk9IkauI5B3nZb2Yo3VUAcK6vQfrMpcSMPWqgH0ngqFkup3Gdr3t_s_yZe_UFwkR8c1pboaxhEuY-iwF_nGiUYHajEPMO6Y1kqWvT8aPz7a_T6t3a1vxyTccgKl_UIx1cU-6IP7qjre2ijtq Stack Overflow是一个与程序相关的IT技术问答网站。用户可以在…