1.什么是double write
  首先要明白double write这个特性是针对谁的,日志or脏数据?
  明白的是脏数据,是内存中修改后的数据页,这些数据页修改后和磁盘上存储的原数据不一致了,称为脏数据。为了数据的持久性,这些脏数据需要刷新到磁盘上,使修改永久的保存,而double write就产生在将脏数据刷盘的过程中。刷盘是一份脏数据写到共享表空间,一份写到真正的数据文件永久的保存。写了两次脏数据,就叫double wriete。
 
2.为什么要有double write
  很多人疑问,为啥写两次,刷一次数据文件保存数据不就行了,写共享表空间是啥意思嘛。共享表空间是在ibdbata文件中划出2M连续的空间,专门给double write刷脏页用的,说白了就是磁盘上2M连续空间。
  MySQL的数据页默认是16k,对数据页的校验也是按16k计算的。而操作系统的数据页默认是2k或者4k,IO操作是按系统页为单位就行读写的。这就可能出现一种情况,数据库对一个16k的数据页修改后,操作系统开始进行写磁盘,每次写4k,结果刚写完第一个4k,数据库挂了。这时候系统一脸懵逼的看着挂掉的数据库,呆呆的说了句‘这事不怨我’。这时候数据库重启时,校验数据页,发现有数据页不完整,就起不来了,即使通过歪门邪道使数据库起来,也会有一页的数据丢失。
  为了解决这个问题,double write就应运而生了,为安全而来。简单来说,修改后的脏页放到double write buffer区,这个区占用2M内存空间,buffer空间满或其他条件触发,使double write buffer存的脏页先写到共享表空间,之后在写入数据文件。这个时候如果写了不完整的页,可以用共享表空间中完整的页加以覆盖,数据页完整了,数据库也就可以拉起了,之后的各种恢复就看redo log的了。提到redo log了,有人可能又会懵逼,不完整的数据页用redo log恢复呗,搞个double write多此一举吗。这时候不得不介绍一下redo log的记录日志格式了——redo log是按数据块的方式记录日志的,差不多类似于脏页直接放到redo log中,但又不完全相同,不然redo log得多占空间啊。它是根据偏移量来记录修改了,比如test数据文件的第1025个数据块的100字节的偏移位置,数据修改为了‘new data’。一个16k的数据块不可能哪儿哪儿都修改,有可能仅仅修改里面的一个字节,而redo log的工作作风就是:修改哪儿记录哪儿。这样,数据页不完整了,找redo log没用。
 

3.double write工作流程
  论double write的工作流程,废话不多说,请直接看图:先产生脏页,产生脏页的过程中会写redo log,这是第一步。脏页有了,也就按部就班了。
4.如何利用double write进行恢复
数据恢复有三种情况:
4.1 脏数据写磁盘成功
  这种情况是最常见的,脏页刷磁盘99.9%都会成功,但是即使有0.1失败可能也要做处理,不然数据丢了,数据库就不安全了,没有公司愿意天天提心吊胆的抱着个定时炸弹。刷盘成功,找检查点,redo log前滚、回滚就行了。
4.2 共享表空间写失败
  如果是写共享表空间失败,那么这些数据不会被写到数据文件,数据库会认为这次刷盘从没发生过,MySQL此时会从磁盘载入原始的数据,然后找检查点,redo log前滚、回滚就行了。
4.3 脏数据刷数据文件失败
  写共享表空间成功,但是写数据文件失败,在恢复的时候,MySQL直接比较页面的checksum,如果不对的话,直接从共享表空间的double write中找到该页的一个最近的副本,将其复制到表空间文件,再应用redo log,就完成了恢复过程。因为有副本所以也不担心表空间中数据页是否损坏。
 
5.double write缺陷及改进过程
  太长了,以后再说。

MySQL 特性:Double Write的更多相关文章

  1. 从偶然的机会发现一个mysql特性到wooyun waf绕过题

    从偶然的机会发现一个mysql特性到wooyun waf绕过题 MayIKissYou | 2015-06-19 12:00 最近在测试的时候,偶然的机会发现了一个mysql的特性, 为啥是偶然的机会 ...

  2. MySQL · 特性分析 · 优化器 MRR & BKA【转】

    MySQL · 特性分析 · 优化器 MRR & BKA 上一篇文章咱们对 ICP 进行了一次全面的分析,本篇文章小编继续为大家分析优化器的另外两个选项: MRR & batched_ ...

  3. Mysql InnoDB三大特性-- double write

    转自:http://www.ywnds.com/?p=8334 一.经典Partial page write问题? 介绍double write之前我们有必要了解partial page write( ...

  4. MySQL · 特性分析 · MDL 实现分析

    http://mysql.taobao.org/monthly/2015/11/04/ 前言 在MySQL中,DDL是不属于事务范畴的,如果事务和DDL并行执行,操作相关联的表的话,会出现各种意想不到 ...

  5. mysql float double 类型

    1.float类型 float列类型默认长度查不到结果.必须指定精度. 比方 num float, insert into table (num) values (0.12); select * fr ...

  6. mysql数据类型double和decimal区别详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt336 实数是带有小数部分的数字.然而,它们不只是为了存储小数部分,也可以使用 ...

  7. mysql 原理 ~ double write

    一 简介:今天来聊聊double write 二 细节 1 Double write 是InnoDB在 tablespace(ibdata1)上的128个页(2个区)是2MB: 2 何谓页断裂 所谓页 ...

  8. mysql之 double write 浅析

    http://blog.itpub.net/22664653/viewspace-1140915/ 介绍double write之前我们有必要了解partial page write 问题 :     ...

  9. Java Web数据库篇之MySQL特性

    MySQL ExplainEXPLAIN 命令的输出内容大致如下: mysql> explain select * from user_info where id = 2\G********** ...

随机推荐

  1. POJ 3067 Japan (树状数组求逆序对)

    POJ - 3067 题意:有(1-n)个城市自上到下在左边, 另有(1-m)个城市自上到下在右边,共有m条高速公路,现求这m条直线的交点个数,交点不包括在城市处相交. 题解:先将高速公路读入,然后按 ...

  2. ui、li模拟下拉框

    转载:原文地址:https://www.jianshu.com/p/e303e0298e9e 效果图: HTML: <div class="rank_top"> < ...

  3. Apache JMeter (一)环境的配置和操作

    JMeter是Apache组织的开放源代码项目,是一款优秀的开源测试工具,可以做功能测试和性能测试.是每个资深的测试工程师必须掌握的测试工具,熟悉JMeter可以大大提高工作效率. 1.下载Jmete ...

  4. MySql(二)_NHibernateHelper管理会话工厂

    1.定义接口的好处: (1) 清楚的看到里面有哪些方法: ( 2 )  可以更换实现类:Nhibernate实现件可以更换: Manger文件夹(另外两个是Model.Mappings文件夹) 首先M ...

  5. 树、图、堆、STL(来自菜鸡的"炒鸡"干粮)

    树.图.堆.STL 图论基础 简单图: 没有自环,两个顶点之间最多只有一条边. 完全图: 一个简单图,每两个顶点之间都有一条边.一共有(n-1)*n/2条边. 二分图: 一个简单图,设G=(V,E)是 ...

  6. 为什么StringBuilder是线程不安全的?StringBuffer是线程安全的?

    面试中经常问到的一个问题:StringBuilder和StringBuffer的区别是什么? 我们非常自信的说出:StringBuilder是线程安全的,StirngBuffer是线程不安全的 面试官 ...

  7. BASLER Pylon 抓取策略

    BASLER Pylon 抓取策略 ( 涛哥工业技术 微信号 TaoRobotics) One by One Grab Strategy 逐个抓取策略 当使用 one by one 抓取模式时,图像按 ...

  8. Eclipse中Spring Boot响应jsp的简单demo

    首先在Eclipse里新建一个maven工程,这里的打包类型和父包如果后续再去pom中添加也可以 此时的工程路径是这样的 接下来去到pom中添加相关的依赖,如果有报错maven update一下即可 ...

  9. 我对android handle更新UI 的一些理解

    1.handle可以方便快捷地管理子线程对主线程UI 的更新, 2.如果不用handle,当多个子线程同时请求更新UI 时,UI更新操作就无法进行

  10. spring框架对于实体类复杂属性注入xml文件的配置

    spring框架是javaWeb项目中至关重要的一个框架,大多web 项目在工作层次上分为持久层.服务层.控制层.持久层(dao.mapper)用于连接数据库,完成项目与数据库中数据的传递:服务层(s ...