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. 基于 APIGateway 打造生产级别的 Knative 服务

    作者 | 阿里云智能事业群高级开发工程师  元毅 导读:在实际应用中,通过 APIGateway(即 API 网关),可以为内部服务提供保护.提供统一的鉴权管理.限流.监控等能力,开发人员只需要关注内 ...

  2. Mac环境IntelliJ IDEA配置JDK提示The selected directory is not a valid home for JDK

    笔者使用mac配置如下: 硬件环境:MacBook Pro 操作系统:MacOS Sierra 10.13.6 开发工具:IntelliJ IDEA 2016.x JDK版本:已有Open JDK 8 ...

  3. 通过脚本实现将服务器的Log实时传送到Telegram群组

    首先说下需求,IT老大提出的一个需求,实现将php-laravel的应用日志实时传送到telegram的监控群组中,不用登陆服务器就可以实时查看应用的日志. 具体思路是: 先要将日志切割,并实时更新这 ...

  4. 时间复杂度big-O、Big-Omega和big-Theta

    我们有三种曲线:   A curve that we know is "above" the running time function when n is large. ( Bi ...

  5. 基于servlet的图书管理系统

    该项目是Java语言开发的图书管理系统,IDE采用eclipse,技术采用servlet,数据库使用mysql,前端页面采用bootstrap框架,简介美观. 系统具备基础的功能,读者可以注册登录,登 ...

  6. 对于synchronized的理解

    一.synchronized 同步关键字,分为同步代码块和同步函数 二.对synchronized的理解(未加static关键字)(以下所说:对同步方法和同步代码块均适用) 对象的创建是以类为模板的 ...

  7. 浅入浅出 Java 排序算法

    Java String 源码的排序算法 一.前言 Q:什么是选择问题? 选择问题,是假设一组 N 个数,要确定其中第 K 个最大值者.比如 A 与 B 对象需要哪个更大?又比如:要考虑从一些数组中找出 ...

  8. Jenkins流水线(pipeline)实战之:从部署到体验

    关于Jenkins流水线(pipeline) Jenkins 流水线 (pipeline) 是一套插件,让Jenkins可以实现持续交付管道的落地和实施. 关于blueocean Blue Ocean ...

  9. spring boot整合kafka

    最近项目需求用到了kafka信息中间件,在此做一次简单的记录,方便以后其它项目用到. 引入依赖 <dependency> <groupId>org.springframewor ...

  10. 如何部署 H5 游戏到云服务器?

    在自学游戏开发的路上,最有成就感的时刻就是将自己的小游戏做出来分享给朋友试玩,原生的游戏开可以打包分享,小游戏上线流程又长,那 H5 小游戏该怎么分享呢?本文就带大家通过 nginx 将构建好的 H5 ...