专栏首页DBA随笔InnoDB的两次写特性

InnoDB的两次写特性

InnoDB的两次写特性 MySQL的体系结构

神图镇楼:

mysql体系结构大概由一下几个部分组成:

1、连接池组件

2、管理服务和工具组件

3、SQL接口组件

4、查询分析器组件

5、优化器组件

6、缓冲组件

7、插件式的储引擎

8、物理文件

Mysql数据库区别于其他数据库的最重要的一个特点就是插件式的存储引擎,存储引擎是基于表的,而不是基于数据库的,这个概念很容易混淆。说到存储引擎,就不得不说innodb,今天主要说说Innodb中的一个关键特性,也就是两次写。

之前的文章中提到过,Innodb中内存和硬盘的交互是通过数据页实现的,这种方式存在一定问题。当发生数据库宕机,可能innodb正在写入某个数据页到表中,而这个数据页只写了一部分,这种情况我们称之为"部分写失效",很容易出现数据丢失的问题。

这种情况下,我们可能会想到通过redo log进行恢复,这是一个办法,但是也存在一些小问题,因为redo log记录的是对数据页的操作,如果这个数据页已经发生了损坏,这种情况下对数据页进行重做是没有意义的,我们必须保证有一个数据页的副本,通过数据页的副本来还原这个数据页,再进行重做,这就是我们所说的二次写,也称之为doublewrite。它的流程图如下:

对于上面这个图,解释如下:

我们看到的double分为两个部分,其中一个是内存中的,大小为2MB,另外一部分是物理磁盘的共享表空间中的,也就是ibdata文件中的连续的128个数据页,128*16K,也就是2MB,在对缓冲池的脏数据进行刷盘的时候,并不会直接写到磁盘中,而是先将数据复制到内存中的doublewrite的缓存中,之后通过缓存,再分两次,每次1MB的写入共享表空间的物理磁盘上。完事儿之后然后立马同步磁盘。这样,一份数据就在磁盘上有两个副本。

在上面的过程中,从数据页往内存中的doublewrite缓冲中写入数据是顺序的,相对来讲比较快,而从内存中的doublewrite落盘时候是离散的IO,相对来讲比较慢。如果在写入磁盘的时候出现了问题,innodb将会在共享表空间的doublewrite中找到该数据页的一个副本,将其复制到表空间文件,再应用重做日志,也就是redo log。

通过这种方式,可以在数据真实落盘之前防患于未然,一旦刷盘的动作失败,可以从共享表空间中找到副本进行恢复。我们都知道,ibdata文件一般比较大,如果你可以接收刷盘失败带来的损失,也可以使用skip_innodb_doublewrite来禁止使用doublewrite的功能,这个参数也可以改进一些性能问题。

本文分享自微信公众号 - DBA随笔(gh_acc2bbc0d447),作者:AsiaYe

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Innodb批量页面刷盘情况下的"两次写"

    我们知道innodb数据页的默认大小是16kb,磁盘和内存通过数据页进行交互,在数据库关闭的时候,innodb会将内存中的数据脏页刷新到磁盘上。如果在刷...

    AsiaYe
  • stm32flash的读写特性

    4、一般都是在最后几页进行数据保存的,确保数据量不超过flash的的大小,比如f103大容量是2k字节,其实一个扇区只能写入1k数量的2字节的数据。

    用户4645519
  • 用Python测试InnoDB和MyISAM的读写性能

    首先我们需要把两张使用了不同引擎的表创建出来,使用为了方便起见,我们直接使用Navicat创建了两张 员工信息表,具体字段如下:

    Python中文社区
  • MySQL探秘(三):InnoDB的内存结构和特性

     常言说得好,每个成功男人背后都有一个为他默默付出的女人,而对于MySQL来说,这个“人”就是InnoDB存储引擎。  MySQL区别于其他数据库的最为重要的特...

    aoho求索
  • MySQL探秘(三):InnoDB的内存结构和特性

    常言说得好,每个成功男人背后都有一个为他默默付出的女人,而对于MySQL来说,这个“人”就是InnoDB存储引擎。  MySQL区别于其他数据库的最为重要的特点...

    用户3128938
  • MySQL探秘(三):InnoDB的内存结构和特性

     常言说得好,每个成功男人背后都有一个为他默默付出的女人,而对于MySQL来说,这个“人”就是InnoDB存储引擎。  MySQL区别于其他数据库的最为重要的特...

    程序员历小冰
  • TokuDB 性能测试报告

    在 TokuDB 的应用场景中,通常是数据库插入操作的量远远大于读取的量,因而本次测试主要针对 TokuDB 的插入性能以及压缩比,以 InnoDB 作为参考基...

    腾讯云数据库团队
  • MySQL锁详解

    转载自http://www.cnblogs.com/luyucheng/p/6297752.html

    allsmallpig
  • MySQL存储引擎MyISAM与InnoDB区别总结整理

    在MySQL 5.1之前的版本中,默认的搜索引擎是MyISAM,从MySQL 5.5之后的版本中,默认的搜索引擎变更为InnoDB。

    Java后端技术
  • MySQL自身对性能的影响

    想要了解MySQL自身对性能的影响,就需要先熟悉MySQL的体系结构和常用的存储引擎。MySQL并不完美,却足够灵活,能够适应高要求的环境,例如Web类应用。同...

    端碗吹水
  • 5年Java开发经验,面试挂在MySQL InnoDB上!大厂究竟多看重MySQL?

    前一段时间好兄弟找工作,面试 Java 资深研发工程师岗位,接到了不少大厂的面试邀请,有顺利接到 offer 的,也有半道儿面试被卡掉的。但最想去的企业却因为 ...

    烂猪皮
  • 【Mysql-InnoDB 系列】InnoDB 架构

    封面图片来自:mysql官方文档,8.0版本,InnoDB Architecture。

    程序员架构进阶
  • 详述MySQL事务及ACID特性的实现原理

    事务是 MySQL 等关系型数据库区别于 NoSQL 的重要方面,是保证数据一致性的重要手段。

    数据和云
  • MySQL锁机制及优化

    总的来说,MySQL各存储引擎使用了三种类型(级别)的锁定机制:行级锁定,页级锁定和表级锁定。下面我们先分析一下MySQL这三种锁定的特点和各自的优劣所在。

    lyb-geek
  • 深入学习MySQL事务:ACID特性的实现原理

    事务是MySQL等关系型数据库区别于NoSQL的重要方面,是保证数据一致性的重要手段。本文将首先介绍MySQL事务相关的基础概念,然后介绍事务的ACID特性,并...

    Bug开发工程师
  • 深入学习MySQL事务:ACID特性的实现原理

    事务是MySQL等关系型数据库区别于NoSQL的重要方面,是保证数据一致性的重要手段。本文将首先介绍MySQL事务相关的基础概念,然后介绍事务的ACID特性,并...

    lyb-geek
  • Mysql之锁、事务绝版详解---干货!

    数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则。对于任何一种数据库来说都需要有相应的锁定机制,所以...

    码农编程进阶笔记
  • 深入学习MySQL事务:ACID特性的实现原理

    来源:https://www.cnblogs.com/kismetv/p/10331633.html

    搜云库
  • innodb为什么需要double write?

    因为Innodb的数据页一般是16K,但是磁盘的页一般是4K,所以写一次磁盘数据,会有4次写磁盘的原子操作,在极端情况下就可能在磁盘写完前面4K后系统断点,此时...

    十毛

扫码关注云+社区

领取腾讯云代金券