广告
返回顶部
首页 > 资讯 > 数据库 >我很理解MySQL中的double write
  • 936
分享到

我很理解MySQL中的double write

2024-04-02 19:04:59 936人浏览 薄情痞子
摘要

本篇文章为大家展示了我很理解Mysql中的double write,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。     mysql

本篇文章为大家展示了我很理解Mysql中的double write,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

    mysql里的double write是InnoDB的三大闪亮特性,另外两个是insert buffer 和自适应哈希,其实还有几个比如异步io,Flush neighbour Page(刷新邻接页),这个和系统层面的关联性较高,所以三大亮点还是更有针对性的。

   当然一说到Mysql里的double write,其实主要是要应对一个很自然的问题,那就是partial write。

经典的partial write问题

   这个问题比较经典,很多数据库设计中都需要考虑到这样一个临界点的问题,MySQL中的页是16k,数据的校验是按照这个为单位进行的,而操作系统层面的数据单位肯定达不到16k,比如是4k,那么一旦发生断电的时候,只保留了部分写入,如果是oracle DBA一般对此都会很淡定,说用redo来恢复嘛,但是可能我们被屏蔽了一些细节,MySQL在恢复的过程中一个基准是检查page的checksum,也就是page的最后事务号,发生这种partial page write 的问题时,因为page已经损坏,所以就无法定位到page中的事务号,所以这个时候redo就无法直接恢复。

   由此引申一点,partial write的问题在Oracle中肯定也会存在,但是只是Oracle替我们把这个过程平滑的做好了。其中有设计的差异,还有恢复技术的差别。但是无论如何这个问题都不会绕过去,还得解决。

   所以这一类问题,如果讨论起来,那可以讨论很长时间,可以把体系结构里的方方面面拿出来分析,做对比。

简单分析double write问题

   对此我画了一个相对简陋的图,也欢迎大家提出改进建议。

我很理解MySQL中的double write

    总体来说,double write buffer就是一种缓冲缓存技术,主要的设计就是为了防止数据在断电,异常情况下丢失数据。里面有几个点需要注意的就是,数据在buffer pool中修改后成了脏页,这个过程会产生binglog记录和redo记录,当然数据写入数据文件是一个异步的工作,如果细看,在共享表空间(system tablespace)中会存在一个2M的空间,分为2个单元,一共128个页,其中120个用于批量刷脏数据,另外8个用于Single Page Flush。根据阿里同学的分析主要是做区分是因为批量刷脏是后台线程做的,这样不影响前台线程。而Single page flush是用户线程发起的,需要尽快的刷脏并替换出一个空闲页出来。所以不是一个严格的64+64的拆分。

       而数据刷新的过程,是先使用memcopy把脏数据复制到内存中的double write buffer,分两次写完,每次写1MB到共享表空间,然后就是调用fsync来同步到磁盘。这里有一点需要注意的是,这个刷新到共享表空间的过程,虽然是两次,但是是顺序写,所以开销不会很大,也就不会像大家想象的double write性能可能很差,根据Percona的测试,大概也就是5%左右的差别,数据重要还是性能更重要,这是一个基本的命题。当然后续会再写入对应的表空间文件中,这个过程就是随机写,性能开销就会大一些。所以在早些时候是用SSD的时候很多人也会带有如此的顾虑,顺序写还是随机写。

    当然double write这么设计就是全面为了作为恢复而用,要不这么大张旗鼓就不值得了。这个图来源于 Http://blog.csdn.net/renfengjun/article/details/41541809

  我觉得已经说得很明白了,就直接引用过来了。我很理解MySQL中的double write

   可以看到里面的一个中心词就是checksum,如果出现了partil write的时候,比如断电,那么两次写的过程中,很可能page是不一致的,这样checksum校验就很可能出现问题,而出现问题的时候,因为有了前期写入共享表空间的页信息,所以就可以重构出页的信息重新写入。

double write的另外一个作用

    double write其实还有一个特点,就是将数据从double write buffer写到真正的segment中的时候, 系统会自动合并连接空间刷新的方式, 这样一来每次就可以刷新多个pages,提高效率。

比如下面的环境,我们可以根据show status的结果来得到一个基本的合并页的情况。

> show status like '%dbl%';  

| Variable_name              | Value    |

| Innodb_dblwr_pages_written | 23196544 |
| Innodb_dblwr_writes        | 4639373  |
通过InnoDB_dblwr_pages_written/InnoDB_dblwr_writes  就可以得到,通过指标也可基本看明白。
   

Percona中的double write改进

   当然对于double write,在Percona中也在持续改进,在Percona 5.7版本中做了一个改进,你可以看到一个新的参数,innodb_parallel_doublewrite_path

| innodb_parallel_doublewrite_path | xb_doublewrite |在系统层面,也会存在一个30的一个文件对应。

-rw-r----- 1 mysql mysql 31457280 Mar 28 17:54 xb_doublewrite也就是并行double write,关于这个特性的详细描述和测试,可以参考。https://www.percona.com/blog/2016/05/09/percona-server-5-7-parallel-doublewrite/?utm_source=tuicool&utm_medium=referral

里面提供了很多详细测试的对比和分析。当然MariaDB,Facebook,Aurora也有一些自己的实现方式和考虑,这个限于精力,还没有细细测试分析。

上述内容就是我很理解MySQL中的double write,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网数据库频道。

您可能感兴趣的文档:

--结束END--

本文标题: 我很理解MySQL中的double write

本文链接: https://www.lsjlt.com/news/62174.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 我很理解MySQL中的double write
    本篇文章为大家展示了我很理解MySQL中的double write,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。     MySQL...
    99+
    2022-10-18
  • 怎么掌握MySQL中的double write
    本篇内容介绍了“怎么掌握MySQL中的double write”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成...
    99+
    2022-10-18
  • 如何浅析mysql中的double write
    这篇文章给大家介绍如何浅析mysql中的double write ,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 介绍double write之前我们有必要了解partial pag...
    99+
    2022-10-19
  • MySQL中Double Write Buffer的分析是怎样的
    这篇文章将为大家详细讲解有关MySQL中Double Write Buffer的分析是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Double Wr...
    99+
    2022-10-19
  • 如何理解mysql的redo日志参数innodb_log_write_ahead_size中read-on-write
    如何理解mysql的redo日志参数innodb_log_write_ahead_size中read-on-write,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需...
    99+
    2022-10-19
  • 我们如何卸载 MySQL 中的时间/日期处理?
    我们可以借助 DATE_FORMAT() 函数将时间/日期处理卸载到 MySQL。日期和时间将根据作为参数传递给函数的格式单位进行卸载。例如,当我们将日期格式单位作为参数传递给 MySQL DATE_FORMAT() 函数时,MySQL 仅...
    99+
    2023-10-22
  • 如何解决mysql中count查询速度很慢的问题
    这篇文章主要介绍了如何解决mysql中count查询速度很慢的问题,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。MySQL 大表的count()...
    99+
    2022-10-18
  • 我们怎样才能从MySQL的输出中了解服务器的性能呢?
    运行查询后,MySQL 返回行数并在输出中给出时间,显示运行该查询所需的时间。例如,如果我们运行以下查询mysql> create table e1(id int); Query OK, 0 rows affected (0.23 s...
    99+
    2023-10-22
  • mysql中的mvcc 原理详解
    目录简介前言一、mysql 数据写入磁盘流程二、redo log1、redolog 的整体流程 2、为什么需要 redo log三、undo log1、undo&...
    99+
    2022-11-13
    mysql mvcc 原理 mysql mvcc 
  • MySQL中的锁怎么理解
    本篇内容主要讲解“MySQL中的锁怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL中的锁怎么理解”吧!01. 怎么认识"锁"...
    99+
    2022-10-19
  • 怎么理解MySQL中的MVCC
    这篇文章将为大家详细讲解有关怎么理解MySQL中的MVCC,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。关系数据库管理系统使用MVCC(Multiversi...
    99+
    2022-10-19
  • 怎么理解MySQL中的table_id
    本篇内容介绍了“怎么理解MySQL中的table_id”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一 t...
    99+
    2022-10-19
  • 怎么理解mysql中的redo log
    今天就跟大家聊聊有关怎么理解mysql中的redo log,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。重做日志(redo log)前言:之前一直弄不清楚 mysql 里面 bin ...
    99+
    2023-06-06
  • 你理解MySQL中的事务吗
    本文主要给大家介绍MySQL中的事务,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下MySQL中的事务吧。一个示例:银行引用是事务的一个经典例子:假如...
    99+
    2022-10-18
  • 如何理解MySQL中的截断
    这期内容当中小编将会给大家带来有关如何理解MySQL中的截断,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 MySQL中的undo截断还是一...
    99+
    2022-10-19
  • 如何理解MySQL中的事务
    今天就跟大家聊聊有关如何理解MySQL中的事务,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。事务又叫做TCL,全称是transaction cont...
    99+
    2022-10-19
  • 如何理解MySQL中的varchar(N)
    本篇文章给大家分享的是有关如何理解MySQL中的 varchar(N),小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 ...
    99+
    2022-10-19
  • 怎么理解MySQL 5.7中的Generated Column
    这期内容当中小编将会给大家带来有关怎么理解MySQL 5.7中的Generated Column,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。  正文&n...
    99+
    2022-10-19
  • 如何理解MYSQL中的type:index 和 Extra:Using
    今天就跟大家聊聊有关如何理解MYSQL中的type:index 和 Extra:Using,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。考虑下面执行...
    99+
    2022-10-19
  • 深入理解r2dbc在mysql中的使用
    简介 mysql应该是我们在日常工作中使用到的一个非常普遍的数据库,虽然mysql现在是oracle公司的,但是它是开源的,市场占有率还是非常高的。 今天我们将会介绍r2dbc在mysql中的使用。 r2dbc-m...
    99+
    2022-05-31
    mysql r2dbc
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作