记得刚开始看InnoDB文档的时候,Double Write一节(其实只有一小段)就让我很困惑。无奈当时内力太浅,纠缠了很久也没弄明白。时隔几个月,重新来整理一下。

涉及到的概念:Buffer Pool简称BP,Dirty Page,Log file,Flush,innodb tablespace。

1. 什么是Double Write

在InnoDB将BP中的Dirty Page刷(flush)到磁盘上时,首先会将Page刷到InnoDB tablespace的一个区域中,我们称该区域为Double write Buffer。在向Double write Buffer写入成功后,再择机将数据拷贝到正在的数据文件对应的位置。

咋一看,这个过程有些多余

2. 为什么需要Double Write

InnoDB中有记录(Row)被更新时,先将其在Buffer Pool(简称BP)中的page更新,并将这次更新记录到Log file中,这时候BP中的该page就是被标记为Dirty。在适当的时候(BP不够、系统闲置等),这些Dirty Page会被flush到磁盘上。

试想,在某个Dirty Page(一般是16K)flush的过程中,发生了系统断电(或者OS崩溃),16K的数据只有8K被写到磁盘上,这种现象被称为(partial page writes、torn pages、fractured writes)。一旦partial page writes发生,那么在InnoDB恢复时就很尴尬:在InnoDB的Log file中虽然知道这个数据页被修改了,但是却无法知道这个页被修改到什么程度,和这个页面相关的redo也就无法应用了。

举个例子:在InnoDB的log file中有如下Log:

Log sequence number 0 4285149977
Log sequence number 0 4287355447
Log sequence number 0 4289260680
Log sequence number 0 4291279900
Log sequence number 0 4293359020

其中第1、3个Log修改了该page,但是在断电时,BP中该page只被flush了一部分。那么InnoDB是无法决定上面的Log是否应该被应用的。这时,数据就出现了不一致。

所以,Log file的有效应用,前提是InnoDB的数据文件中的Page是一致的。

简而言之,Double write就是为了避免Partial page writes而设计的。

3. Double Write对性能的影响

系统需要将数据写两份,一般认为,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对效率的影响并不大。

4. 相关参数与状态

是否打开了double write:

root@(none) 07:16:16>show variables like "%double%";
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| innodb_doublewrite | ON    |
+--------------------+-------+

Double write的使用情况:

root@(none) 07:15:50>SHOW STATUS LIKE "%innodb_dblwr%";
+----------------------------+-----------+
| Variable_name              | Value     |
+----------------------------+-----------+
| Innodb_dblwr_pages_written | 145373349 |
| Innodb_dblwr_writes        | 2249336   |
+----------------------------+-----------+

上面可以看到,从BP共Flush了145373349个Pages到double write buffer中;一共调用了2249336次write写到真正的数据文件。可见,相当于每次write合并了 145373349 / 2249336 = 64.6次Flush。(这就是为什么double write buffer为什么并不会对效率有很大影响的原因)

5. 我的看法

在某些文件系统(ZFS等)层面能够保证不出现Partial page writes时,可以关闭Double Write。因为它对性能影响并不大,一般情况都建议打开,毕竟带来的数据安全性保障可能是我们更关心的。

参考文献:

[0]. Manual about Double Write

[1]. Innodb Double Write

[2]. Do you need the InnoDB doublewrite buffer

[3]. MySQL Performance: InnoDB Doublewrite Buffer Impact

原博客地址:http://www.orczhou.com/index.php/2010/02/innodb-double-write/

转载于:https://blog.51cto.com/gfsunny/1586153

InnoDB Double write相关推荐

  1. mysql 配置32g内存_MySQL性能测试 : 新的InnoDB Double Write Buffer

    原文链接:http://dimitrik.free.fr/blog/posts/mysql-80-perf-new-dblwr.html 作者:Dimitri 译者:孟维克 新的MySQL8.0.20 ...

  2. Oracle为什么不需要double write?

    近期看到朋友圈转发了几篇关于MySQL innodb double write的文章:感觉都还不错.突然想到为什么Oracle没有这个东西?PostgreSQL是否也有类似机制? 在网上搜了一下,发现 ...

  3. 史上最强解读:Oracle里面为什么没有double write?

    导读:MySQL有double write机制,PostgreSQL有full page write机制,那么Oracle里面为什么没有类似机制呢? 近期看到朋友圈转发了几篇关于MySQL innod ...

  4. oracle rollup分组没有数据时为0_数据库周刊19│GBASE适配鲲鹏;MySQL窗口函数;OGG双向数据同步……...

    摘要:墨天轮数据库周刊第19期发布啦,每周1次推送本周数据库相关热门资讯.精选文章.干货文档.本周分享GBASE适配鲲鹏: 疫情激活COBOL语言:TiDB数据库的未来:Oracle与double w ...

  5. MySQL这一章就够了(一)

    前言:呕心沥血5个月淦出本文,整理所有MySQL知识.我愿称之为地表最强MySQL. MySql笔记 MySQL是关系型数据库,基于SQL查询的开源跨平台数据库管理系统.它最初是由瑞典MySQL AB ...

  6. 如何最快恢复逻辑备份

    导读 作者:Nickolay Ihalainen 翻译团队:星耀队(芬达,刘莉,Ziroro) 关键词:backup,data integrity,InnoDB, MySQL logical back ...

  7. 《Designing Data-Intensive Application》03存储与检索

    <Designing Data-Intensive Application> 驱动数据库的数据结构 哈希索引 SSTables和LSM树 构建和维护SSTables 用SSTables制作 ...

  8. 设计数据密集型应用 第三章:存储与检索

    3. 第三章:存储与检索 建立秩序,省却搜索 --德国谚语 文章目录 3. 第三章:存储与检索 驱动数据库的数据结构 哈希索引 SSTables和LSM树 构建和维护SSTables 用SSTable ...

  9. mysql的三大特性_【mysql】Innodb三大特性之double write

    1.doublewrite buffer(mysql官方的介绍) InnoDB uses a novel file flush technique called doublewrite. Before ...

最新文章

  1. pgjdbc源码分析
  2. 如何正确应对在线故障
  3. 【AI产品】一键时光穿梭表情互动,这款FaceApp你知否?
  4. 递归系列之一_南诺塔问题
  5. 十个问题弄清JVMGC(二)
  6. jsp内置对象+Servlet
  7. 视频倒退编辑android,视频倒放剪辑app下载-视频倒放剪辑 v2.6.3 安卓版 - 下载吧...
  8. 2016第11届四川省高校计算机(软件)院长论坛纪要(旁听)
  9. java如何替换字符串0A_我有一个带有“ \ u00a0”的字符串,我需要将其替换为“” str_replace failed...
  10. Codis的源码编译生成tar包
  11. 断开式数据连接 DataSet与DataAdapter对象 1204
  12. SpringSecurityFilterChain
  13. tar.xz压缩工具使用(转)
  14. 银行理财子公司的“超级”玩法
  15. Python数据分析与挖掘实战总结
  16. Chrome 管理搜索引擎
  17. 通过PD4ML把html转pdf(包含显示页眉页脚,插入图片,显示页数)
  18. 菜鸟网络今日发布超级机器人旗舰仓
  19. ibm tivoli_在Tivoli Access Manager环境中管理TDS 6.0代理服务器并进行故障排除
  20. 【机器学习基础】无监督学习(1)——PCA

热门文章

  1. Java 方法重载 方法重写
  2. pandas删除缺失数据(pd.dropna()方法)
  3. 推荐大家使用的CSS书写规范、顺序
  4. 试玩 go-socks5
  5. DotNetNuke CSS hierarchy
  6. 实时分布式搜索引擎比较(senseidb、Solr、elasticsearch)
  7. 网页制作中规范使用DIV+CSS命名规则(转)
  8. SP 短信开发-基础知识篇
  9. 第二讲 完全背包问题(对背包九讲的学习)
  10. 使用fork并发处理多个client的请求和对等通信p2p