zoukankan      html  css  js  c++  java
  • MySQL学习(十一)double write 介绍 (半原创)

    复习

    Innodb关键的特性

    • 插入缓存
    • 两次写
    • 异步IO
    • 刷新邻近页
    • 自适应哈希索引

    概述

    double write 的主要的作用是保证写入数据库文件的可靠性。通俗地说就是一份数据写两个地方,当出现异常的时候,拿备用的一份进行恢复,于是这就有个问题了,这样写不会很慢吗?不会,备份的那份可以设计成顺序写。

    动机

        InnoDB存储引擎正在刷某个脏页到文件中,而这个页写了一半,比如16KB的页,只写了前4KB,之后就发生了 down,这种情况称之为 部分写失效(partial page write),也就是说刷了一半的页发生了异常,那这样的数据肯定是不完整。     你肯定会说用 redo log 来恢复该数据页不就行了吗,这是一种方法,但是要知道 redo log 记录的是某个数据页的物理变化,例如 : 在偏移量800的地方写记录‘aaa’。此时数据页的这一行损坏了根本就无法运用 redo log ,也就是说在应用重做日志之前,用户需要一个页的副本,当写入失效发生的时候通过页的副本来还原该页,然后再运用重做日志.

    发生失效的情况

    图片和部分总结来自参考资料

    关于IO的最小单位:

      1、数据库IO的最小单位是16K(MySQL默认,oracle是8K)

      2、文件系统IO的最小单位是4K(也有1K的)

      3、磁盘IO的最小单位是512字节

    因此,存在IO写入导致page损坏的风险:

    double write 工作过程

    double write 恢复失效异常

        如果操作系统在将页写入磁盘的过程中发生崩溃,在恢复过程中,innodb存储引擎可以从共享表空间的doublewrite中找到该页的一个最近的副本,将其复制到表空间文件,再应用redo log,就完成了恢复过程。     因为有副本所以也不担心表空间中数据页是否损坏。

    工作过程

    工作过程如下,同时写到两个地方,由于顺序写的原因,写入很快(这一点很像redo-log). 1297993-20200227111153792-1574559822.png

    重要参数

    mysql> show global status like '%dblwr%';
    +----------------------------+-------+
    | Variable_name              | Value |
    +----------------------------+-------+
    | Innodb_dblwr_pages_written | 7     |
    | Innodb_dblwr_writes        | 3     |
    +----------------------------+-------+
    2 rows in set (0.00 sec)
    
    

    Innodb_dblwr_pages_written / Innodb_dblwr_writes

      开启doublewrite后,每次脏页刷新必须要先写doublewrite,而doublewrite存在于磁盘上的是两个连续的区,每个区由连续的页组成,一般情况下一个区最多有64个页,所以一次IO写入应该可以最多写64个页。

      而根据以上系统Innodb_dblwr_pages_written与Innodb_dblwr_writes的比例来看(可以理解为每秒写了多少页),大概在3左右,远远还没到64(如果约等于64,那么说明系统的写压力非常大,有大量的脏页要往磁盘上写),所以从这个角度也可以看出,系统写入压力并不高。

    关闭两次写

    关闭double write适合的场景

      1、海量DML

      2、不惧怕数据损坏和丢失,例如某些文件系统本身就支持防止部分丢失的问题

      3、系统写负载成为主要负载

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

    补充

    为什么log write不需要doublewrite的支持?

    因为redolog写入的单位就是512字节,也就是磁盘IO的最小单位,所以无所谓数据损坏。

    ## 参考资料 -《MySQL技术内幕:InnoDB存储引擎》

  • 相关阅读:
    Enterprise Library Step By Step系列(一):配置应用程序块——入门篇
    Enterprise Library Step By Step系列(八):日志和监测应用程序块——进阶篇
    在ASP.NET页面中冻结DataGrid的列或头部
    数据库设计技巧系列(五)——各种小技巧
    用任务计划实现数据库的异地备份
    如何更好的与人沟通?[图]
    在Asp.net中如何用SQLDMO来获取SQL Server中的对象信息
    SQL Server 2012 Express LocalDB
    Clay: 创建和使用深层次对象图
    VS 2012 的 单元测试 和 测试资源管理器
  • 原文地址:https://www.cnblogs.com/Benjious/p/12371127.html
Copyright © 2011-2022 走看看