我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL中Double Write Buffer的分析是怎样的

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL中Double Write Buffer的分析是怎样的

这篇文章将为大家详细讲解有关MySQL中Double Write Buffer的分析是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

Double Write Buffer是什么?
这是一个buffer,存在于内存中,在持久化到磁盘的时候,这一部分数据会写进innodb的表空间里,由一段连续的pages组成
Double Write这个特性,和命名所描述的完全一致:写两遍~

为什么要引入Double Write Buffer?
引入Double Write Buffer是为了解决partial page write的问题,关于这个问题的描述,引用杨大师的原文,
>>>
InnoDB 的Page Size一般是16KB,其数据校验也是针对这16KB来计算的,将数据写入到磁盘是以Page为单位进行操作的。
而计算机硬件和操作系统,在极端情况下(比如断电)往往并不能保证这一操作的原子性,
16K的数据,写入4K 时,发生了系统断电/os crash ,只有一部分写是成功的,这种情况下就是 partial page write 问题。
<<<

追问1:抛开page不完全写入的这个概念,DB在做crash recovery的时候,不是可以从redo log来重新做一遍么,为什么还要这个特性呢?
解答:原因有两个,
1.由于Page的不完全写入,实际上这个出问题的Page由于没有完全写入所以这个page的checksum是无效的,想恢复这个page的时候,无法定位是哪个page写出了问题;
2.redo-log的原因, MySQL的innodb在生成redo-log的时候,并没有写入具体数据的变更,而是只记录了这个变更所在的page信息,具体的格式如下
    [Space-id] [Page-id] [Where-in-the-page-to-modify] [Payload]
其中,space-id记录的是这个信息存储于哪个redo-log文件,page-id记录的就是page的id(..._(:з」∠)_...),其余信息基本如描述所示;
由于redo-log的这种记录方式,使得MySQL不能依靠redo-log去把崩溃前后一段时间的整个事务全部找出来,然后重做;(存都没存数据,怎么恢复╮(╯▽╰)╭

Double Write Buffer工作在哪个阶段/时机?
当innodb从buffer pool中刷新pages到磁盘时,并不是直接往磁盘写,而是先写进这个Double Write Buffer,
然后马上调用fsync(),将这一部分数据写到磁盘上,之后再把这部分的pages写到真正的数据文件里面去;

Double Write Buffer能不能解决问题?
答案肯定是可以~
情景1:innodb从buffer pool往Double Write Buffer写pages的时候,出事故了,发生了page的部分写入;
分析:innodb在crash recovery的时候,检查到数据文件的pages都是正常的,通过比较LSN/checksum能够检查到数据文件的具体状态,然后再去恢复数据;
情景2:Double Write Buffer往真正的数据文件写pages的时候,出事故了,发生了page的部分写入;
分析:由于Double Write Buffer本身有这个pages的完整内容,从Double Write Buffer重新往数据文件写pages即可;

Double Write Buffer对性能的影响?
由于Double Write Buffer本身是一段完全连续的空间,所以Double Write Buffer从内存写到磁盘的时候是完完全全的顺序写
所以对性能的影响并没有从1个fsync()到2个fsync()这么夸张,引用percona的工程师的判断:性能影响不超过5%-10%;

关于MySQL中Double Write Buffer的分析是怎样的就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL中Double Write Buffer的分析是怎样的

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

下载Word文档

猜你喜欢

怎样分析MySQL中锁的相关问题

这篇文章给大家介绍怎样分析MySQL中锁的相关问题,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。锁分类:从对数据操作的粒度分 :表锁:操作时,会锁定整个表。行锁:操作时,会锁定当前操作行。从对数据操作的类型分:读锁(共
2023-06-22

Kubernetes Informer的示例分析是怎样的

Kubernetes Informer的示例分析是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。熟悉Kubernetes的小伙伴们想必会有一窥源码的动机,领略大师的设
2023-06-19

Linux的内存中Swap和Cache以及Buffer的介绍是怎样的

Linux的内存中Swap和Cache以及Buffer的介绍是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 total:总内存大小。 used:已经使用的内存大小(这里
2023-06-15

怎样进行mysql数据库的分析

怎样进行mysql数据库的分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、数据库是什么?数据库是管理数据的一类软件。对数据的管理体现在两个方面,第一是描述数据,即一条
2023-06-22

Java泛型的原理分析是怎样的

这篇文章将为大家详细讲解有关Java泛型的原理分析是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、前言泛型在java中有很重要的地位,在实际开发中用处也很大。二、泛型泛型:是jdk
2023-06-26

python数据分析入门是怎样的

这篇文章将为大家详细讲解有关python数据分析入门是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 随着Python自身功能的完善以及生态系统的扩展,Python在Web开发、网络爬
2023-06-02

kubernetes API Server原理分析是怎样的

这篇文章将为大家详细讲解有关kubernetes API Server原理分析是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一:简介k8s API Server提供了k8s各类资源对
2023-06-04

Python数据分析过程是怎样的

这篇文章主要介绍“Python数据分析过程是怎样的”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python数据分析过程是怎样的”文章能帮助大家解决问题。一、需求介绍该需求主要是分析某一种数据的历史
2023-06-26

C++11 constexpr使用分析是怎样的

C++11 constexpr使用分析是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。C++11为了提高代码执行效率做了一些改善。这种改善之一就是:生成常量表达式,允
2023-06-22

python数据分析中的异常值处理是怎样的

本篇文章为大家展示了python数据分析中的异常值处理是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。异常值异常值是指样本中的个别值,其数值明显偏离其余的观测值。异常值也称离群点,异常值的分析
2023-06-29

编程热搜

目录