os: centos 7.4
db: mysql 5.7.28

版本

# cat /etc/centos-release
CentOS Linux release 7.4.1708 (Core)
#
# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.7.28 MySQL Community Server (GPL)Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.28    |
+-----------+
1 row in set (0.00 sec)mysql> 

partial page write

innodb 的 page size 一般是16KB,其数据校验也是针对这 16KB 来计算的,将数据写入到磁盘是以Page为单位进行操作的。
而计算机硬件和操作系统,在极端情况下(比如断电)往往并不能保证这一操作的原子性,16K的数据,写入4K 时,发生了系统断电/os crash ,只有一部分写是成功的,这种情况下就是 partial page write 问题。
如果使用 mysql redolog 进行恢复时,就会检查 page 的 checksum(checksum 就是page的最后事务号),但是发生 partial page write 问题时,page已经损坏,找不到该page中的事务号,就无法恢复。

double write

这里需要提一下共享表空间,是在 ibdbata 文件中划出2M连续的空间,专门给 double write 刷脏页用的,说白了就是磁盘上2MB(128个页,2个区)连续空间。

mysql 为什么需要 double write,刷一次数据文件保存数据不就行了。

主要还是为了解决极端情况下的 partial page write 问题 ,当 mysql 将脏数据 flush 到 data file 的时候, 先使用 memcopy 将脏数据复制到内存中的 double write buffer ,之后通过 double write buffer 再分2次,每次写入1MB到共享表空间,然后马上调用fsync函数,同步到磁盘上,避免缓冲带来的问题,在这个过程中,doublewrite是顺序写,开销并不大,在完成doublewrite写入后,在将double write buffer写入各表空间文件,这时是离散写入。
如果发生了极端情况(断电),InnoDB再次启动后,发现了一个Page数据已经损坏,那么此时就可以从 doublewrite buffer 中进行数据恢复了。

默认 double write 是开启的,可以手动修改参数,禁止 double write

mysql> show global variables like '%double%';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| innodb_doublewrite | ON    |
+--------------------+-------+
1 row in set (0.01 sec)

查看 status double write

mysql> show status like  "%InnoDB_dblwr%";
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Innodb_dblwr_pages_written | 2     |
| Innodb_dblwr_writes        | 1     |
+----------------------------+-------+
2 rows in set (0.00 sec)

double write 的缺点
位于共享表空间上的double write buffer实际上也是一个文件,写DWB会导致系统有更多的fsync操作, 而硬盘的fsync性能, 所以它会降低mysql的整体性能. 但影响并不是特别的大, 这主要是因为:
1、double write 是一个连接的存储空间, 所以硬盘在写数据的时候是顺序写, 而不是随机写, 这样性能更高.
2、将数据从double write buffer写到真正的 segment 中的时候, 系统会自动合并连接空间刷新的方式, 每次可以刷新多个pages;

参考:

mysql 特性之一 double write (双写)相关推荐

  1. mysql改表字段类型导致数据丢失_故障分析 | 记一次 MySQL 主从双写导致的数据丢失问题【转】...

    一.问题起源 不久前用户反馈部门的 MySQL 数据库发生了数据更新丢失.为了解决这个问题,当时对用户使用的场景进行了分析.发现可能是因为用户在两台互为主从的机器上都进行了写入导致的数据丢失. 如图所 ...

  2. mysql sync es 异步双写_mysql数据同步es方案思考

    在线QQ客服:1922638 专业的SQL Server.MySQL数据库同步软件 大体计划 1.双写 矫捷长处:简略. 错误谬误: a.停业代码耦合严重. b.如何保证双写成功 c.同步双写会增加响 ...

  3. 数据库周刊62丨央企2021年数据库成交公告,国产占90%;流数据库HStreamDB开源;MySQL主从双写导致数据丢失;Oracle 19c升级最佳实践;PG日常工作分享;MySQL MGR运维指

    热门资讯 [1.中央国家机关2021年数据库成交公告:国产数据库份额占90% [摘要]据央采网3月19日发布的<中央国家机关2021年数据库软件协议供货采购项目成交公告>显示事务型数据库管 ...

  4. mysql双写是什么意思_MYSQL双写和块裂

    什么时块裂呢? 这就涉及到OS(操作系统)的原子写的大小,一般情况下OS原子写是4K,硬盘一个扇区是512字节,4K需要写8个扇区. 假如写了4个扇区发生了断电,或者其他的意外,那么不就是丢失了另外4 ...

  5. 面试官: Redis 与 MySQL 双写一致性如何保证?

    前言 四月份的时候,有位好朋友去美团面试.他说,被问到Redis与MySQL双写一致性如何保证?这道题其实就是在问缓存和数据库在双写场景下,一致性是如何保证的?本文将跟大家一起来探讨如何回答这个问题. ...

  6. 美团二面:Redis与MySQL双写一致性如何保证?

    前言 四月份的时候,有位好朋友去美团面试.他说,被问到Redis与MySQL双写一致性如何保证?这道题其实就是在问缓存和数据库在双写场景下,一致性是如何保证的?本文将跟大家一起来探讨如何回答这个问题. ...

  7. Redis与MySQL双写一致性如何保证

    谈谈一致性 一致性就是数据保持一致,在分布式系统中,可以理解为多个节点中数据的值是一致的. 强一致性:这种一致性级别是最符合用户直觉的,它要求系统写入什么,读出来的也会是什么,用户体验好,但实现起来往 ...

  8. 你真的懂Redis与MySQL双写一致性如何保证吗?

    一致性就是数据保持一致,在分布式系统中,可以理解为多个节点中数据的值是一致的. 强一致性:这种一致性级别是最符合用户直觉的,它要求系统写入什么,读出来的也会是什么,用户体验好,但实现起来往往对系统的性 ...

  9. redis进阶:mysql,redis双写一致性,数据库更新后再删除缓存就够了吗?

    0. 引言 最近线上的一个状态修改功能出现了问题,一开始是运营找了过来,运营告知某条数据的状态已经开启了的,但是实际使用起来还是没有生效,于是拿到这个问题后,首先就去数据库查了这条数据,发现确实如他所 ...

最新文章

  1. Oracle删除表主键语句
  2. java中的排序方法,Java中的排序比较方式:自然排序和比较器排序
  3. (84)FPGA显示激励(display)
  4. 有多少小微餐饮创业者陷入了“就业型创业”的死亡漩涡而不自知?
  5. iPhone手机投屏小米盒子
  6. 使用 FUSE 开发自己的文件系统
  7. 系统学习机器学习之神经网络(七) --CPN
  8. 计算机电源线税务编码,电力电子元器件税收分类编码
  9. OPPO发布首款折叠旗舰Find N, 产品+服务高端化布局并行
  10. 数据库练习题归纳整理
  11. fqa什么意思_FQA是啥意思
  12. implode 与 explode 区别
  13. pythonarcgis插件_【直播】基于Python开发ArcGIS插件:Python Add-in丨城市数据派
  14. android hdmi解码器,如何使用HDMI高清编码器进行直播
  15. HTML+CSS鼠标悬停效果
  16. css裁剪属性----clip-path
  17. 展会推广有哪些好的创意 怎样让展会推广更有创意
  18. 通用mapper 根据条件修改、查询
  19. 深度学习(二)-----算法岗面试题
  20. 《Kotlin 极简教程 》第6章 泛型

热门文章

  1. python爬取微博数据词云_用Python爬取微博数据生成词云图片
  2. 解决click在ios反应慢的问题
  3. 如何删除word空白页技巧汇总
  4. 1000个已成功入职的软件测试工程师简历经验总结:软件测试工程师简历项目经验怎么写?(含真实简历模板)
  5. TensorFlow基础学习
  6. Flutter模拟器运行显示不正常问题(夜游神安卓模拟器)
  7. FSCapture 录制视频没有声音的解决方法
  8. 本地html文件显示不全,网页显示不全,详细教您网页显示不全怎么办
  9. VGA、DVI、HDMI、DP 接口介绍及优劣
  10. uva 10537 The Toll! Revisited