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. Codeforces 729C Road to Cinema(二分)

    题目链接 http://codeforces.com/problemset/problem/729/C 题意:n个价格c[i],油量v[i]的汽车,求最便宜的一辆使得能在t时间内到达s,路途中有k个位 ...

  2. codeforces 284 C. Cows and Sequence(线段树)

    题目链接:http://codeforces.com/contest/284/problem/C 题意:就是给出3个操作 1)是将前i 个数加x 2)在数组最后添加一个数x 3)删除数组最后的那个数 ...

  3. Idea各种快捷生成Live Template的代码整合

    Idea各种快捷生成整合 快速生成method方法注释 配置方法 打开Idea ---> Settings , 搜索 live 点击右边的 + 号,创建模板组 Template Group,之后 ...

  4. Spring boot出现Cannot determine embedded database driver class for database type NONE

    在spring boot项目中,我们在pom.xml文件中添加了mysql和mybatis的依赖,我们常常遇到下面这样的问题: Description: Cannot determine embedd ...

  5. 树莓派4B 安装CentOS

    刚入手了一个树莓派4B替换掉旧的3B搭Nas.吐槽下3B的网卡和USB速度真的太慢. 虽然官方推荐的是Debina,由于习惯了CentOS不想增加学习成本,我还是决定用CentOS. 镜像下载地址:h ...

  6. mysql 复制表结构和表数据

    CREATE TABLE a1 ( id INT NOT NULL AUTO_INCREMENT COMMENT '编号', txt VARCHAR(20) NOT NULL DEFAULT '' C ...

  7. FreeSql (三十一)分区分表

    分区 分区就是把一个数据表的文件和索引分散存储在不同的物理文件中.把一张表的数据分成N多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上,数据库不同实现方式有所不同. 与分表不同,一张大表进行 ...

  8. Python网络爬虫实战(三)照片定位与B站弹幕

    之前两篇已经说完了如何爬取网页以及如何解析其中的数据,那么今天我们就可以开始第一次实战了. 这篇实战包含两个内容. * 利用爬虫调用Api来解析照片的拍摄位置 * 利用爬虫爬取Bilibili视频中的 ...

  9. Linux 笔记 - 第十三章 Linux 系统日常管理之(一)系统状态监控

    博客地址:http://www.moonxy.com 一.前言 如果你是一名 Linux 运维人员,最主要的工作是优化系统配置,使应用在系统上以最优的状态运行.系统运行状态主要包括:系统负载.内存状态 ...

  10. 控制执行流程之return

    1 .无条件分支的关键词:return, break,continue,它们在程序中表示这个分支无需任何测试也可以发生.今天我们说下return. 2. return 作用:(1)给当前方法返回值:( ...