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. CF - 652F Ants on a Circle

    题目传送门 题解: 先观察蚂蚁相撞, 可以发现, 如果我们将相撞的2个蚂蚁互换位置的话,蚂蚁相当于没有碰撞体积,直接穿过去了.所以我们可以直接计算出最终哪些位置上会有蚂蚁. 接下来就需要知道蚂蚁们的最 ...

  2. CODE[VS] 3269 混合背包

    3269 混合背包  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 背包体积为V ,给出N ...

  3. CF989C A Mist of Florescence 构造 思维好题 第八题

    A Mist of Florescence time limit per test 1 second memory limit per test 256 megabytes input standar ...

  4. golang开发:类库篇(五)go测试工具goconvey的使用

    为什么要使用goconvey测试程序 goconvey 集成go test,go test 无缝接入.管理运行测试用例,而且提供了丰富的函数断言.非常友好的WEB界面,直观的查看测试结果. 如果没有g ...

  5. golang时间转换

    1.datetime转换成时间字符串 package main import ( "fmt" "reflect" "time" ) func ...

  6. SpannableString设置文本背景色

    参考内容: http://blog.csdn.net/harvic880925/article/details/38984705 http://blog.it985.com/14433.html 1. ...

  7. Volatile与synchronize的区别

    仅靠Volatile不能保证线程的安全性(原子性) 1.Volatile轻量级的,只能修饰变量.synchronize重量级的,还可以修饰方法 2.Volatile只保证数据的可见性,不能用来同步,因 ...

  8. 排序入门练习题3 谁考了第k名 题解

    题目出处:<信息学奥赛一本通>第二章 上机练习1 题目描述 在一次考试中,每个学生的成绩都不相同,现知道了每个学生的学号和成绩,求考第k名的学生的学号和成绩. 输入格式 输入的第一行包含两 ...

  9. mgo操作mongodb

    mgo基本使用: http://labix.org/mgo 安装 # go get gopkg.in/mgo.v2 package main import ( "fmt" &quo ...

  10. 编译gaia

    ./rkst/mkimage.sh rk3066-eng -j8 gaia 分别是编译文件路径 编译的输出类型 处理器分配数 待编译模块 //flash gaia1. adb remount2. ad ...