从MySQL innoDB的特性Doublewrite buffer谈起

news2024/12/24 3:14:48

文章目录

        • 前言
        • 什么是Doublewrite buffer
        • 为什么要叫它Doublewrite呢,双写分别是哪两次写,体现在了什么地方呢
        • 为什么需要Doublewrite buffer
        • Doublewrite buffer的具体使用
          • 1.假如还没有进行第一次写的时候crash了,也就是Doublewrite buffer和磁盘数据文件都没有写成功
          • 2.假如第一次写成功,在往原有磁盘文件中写脏页的时候crash了,Doublewrite buffer拥有部分完整的数据
        • 谈谈PgSQL和Oracle在这方面的处理
        • 从操作系统再看Doublewrite Buffer

前言

来分享下我对MySQL innoDB引擎的特性之一:Doublewrite Buffer的理解。
我争取把想要表达的东西讲清楚~

捋之前先明确几个知识点

  • MySQL InnoDB引擎默认IO的页大小为16k(可调整大小,但不推荐);操作系统的磁盘IO大小一般为4K或者1k,并不固定
  • Doublewrite Buffer并不是内存开辟的一块区域,8.0.20之前是在系统表空间中,8.0.20之后是专门有了doublewrite files 。

什么是Doublewrite buffer

Doublewrite buffer并不是在内存中开辟的一块区域
Doublewrite buffer并不是在内存中开辟的一块区域
Doublewrite buffer并不是在内存中开辟的一块区域

虽然它叫buffer结尾,但它确实是在磁盘中开启的空间!!!

8.0.20之前是存在于系统表空间中,8.0.20之后是专门有了doublewrite files存储;
对于5.7的文档,也是说明了Doublewrite buffer存在于系统表空间
体现形式至少是两个文件,如下图格式

#ib_16384_0.dblwr
#ib_16384_1.dblwr

MySQL 8.0文档很清晰的描述了Doublewrite buffer
是在磁盘上的一块连续的空间

在学习Doublewrite buffer的过程中我翻阅了很多博客的文章,

发现很多博客将Doublewrite buffer描述地很不清晰,无法验证来源

1.比如Doublewrite buffer是在内存中的一块空间
2.还有类似双写是先写内存,再写系统表空间
3.还有类似下图的架构,来自于鼎鼎大名的《MySQL技术内幕》但是官网版本也不可考证,如果有hxd知晓的,请指正
在这里插入图片描述

等等这些理论都不可考究,至少在官网的描述中,我并没有看到这些逻辑,如果大伙儿有明白的,滴滴我。


如下图,官方架构描述
在这里插入图片描述

在这里插入图片描述

为什么不直接写
可能会写坏原磁盘页数据

为什么要叫它Doublewrite呢,双写分别是哪两次写,体现在了什么地方呢

第一次 将脏页写Doublewrite buffer
第二次 在落盘Doublewrite buffer之后,再将脏页写入它们所在磁盘的位置
如下图所示在官方文档中,15.11.1 InnoDB Disk I/O 明确说明了 两次写的逻辑
在这里插入图片描述

为什么需要Doublewrite buffer

MySQL InnoDB引擎默认IO的页大小为16k;操作系统的磁盘IO大小一般为4K或者1k,并不固定;
那么当InnoDB将脏页flush到磁盘的时候,需要多次磁盘IO将数据写入。


将脏页直接刷入磁盘的过程中,在其中某次IO之后,假使意外发生,断电或者服务器异常,刷盘终止;对于InnoDB来说,后续重启读到的页数据是个不完整甚至是错误的数据页;上述问题就是所谓partial write


重启InnoDB数据恢复是通过Redo Log来进行,应用 Redo Log有一个前提:数据页必须是完好无损的。要保证数据页的完整性,应用 Redo 日志之前需要修复损坏的数据页


综上所述8.0.20之后的doublewrite files就是在恢复过程中修复不完整的数据页

Doublewrite buffer的具体使用

分情况讨论下,Doublewrite buffer两次写在crash之后的作用,如有不当之处,请指正~

本文具体暂不讨论redo log 和bin log的恢复过程
以下的前提redo log 是完整的文件

1.假如还没有进行第一次写的时候crash了,也就是Doublewrite buffer和磁盘数据文件都没有写成功
那么重启恢复的过程中,原有磁盘数据文件一定是完整的,但文件中并没有buffer pool中的脏页
读取redo log进行回放数据

校验原有磁盘数据文件页是完整的 通过
校验原有磁盘数据文件页的LSN 和 redo log文件的LSN
根据原有磁盘数据文件页的LSN,确定redo log恢复文件的起点
恢复文件

2.假如第一次写成功,在往原有磁盘文件中写脏页的时候crash了,Doublewrite buffer拥有部分完整的数据
那么重启恢复的过程中,使用Doublewrite buffer中的页数据进行覆盖写入脏页进入原有磁盘文件,假如Doublewrite buffer中的页数据不完整可以丢弃不用。
读取redo log进行回放数据

校验磁盘数据文件页是完整的 通过
校验磁盘数据文件页的LSN 和 redo log文件的LSN
根据磁盘数据文件页的LSN,确定redo log恢复文件的起点
恢复文件

谈谈PgSQL和Oracle在这方面的处理

以下是摘录自 https://blog.csdn.net/enmotech/article/details/105423975

PostgreSQL是通过full_page_write来解决这个问题,就是在数据页第一次发生变更的时候将整个页面记录到xlog日志中,这样出了问题就有了完整的数据页加xlog日志进行恢复,这样做的缺点是大大增加了xlog的日志量,也对性能有一定影响

Oracle 中不是没有partial write的问题,而是Oracle 本身具有很多数据块的完整校验机制,写失败就直接回滚掉了,甚至在Oracle 11gR2版本还有写数据文件发现IO异常直接crash 实例的特性(当然是为了更好的保护数据库的完整性)。总的来讲我个人认为Oracle的安全性还是非常高的。通过简单分析,也能说明为什么很多存储复制软件来做Oracle容灾,在关键时刻备库不一定能正常打开就的原因就是这样。
————————————————
版权声明:本文为CSDN博主「数据和云」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/enmotech/article/details/105423975

从操作系统再看Doublewrite Buffer

在有些操作系统和磁盘,Doublewirte Buffer可能并不需要开启。
原子写在这些系统上是支持的,每次IO的大小是大于MySQL的页大小;
也就不存在 partial write;
如果都使用了支持原子写的fusion-io 等存储设备,那么double write机制会被自动disable。
同时官方建议将innodb_fush_method设置为o_direct,这样可以充分发挥硬件性能。
除了硬件等支持,那么传统等文件系统比如ext4/xfs/zfs/VxFS 是否支持原子写呢?
实际上ext4/xfs对原子写支持目前都不是非常优化,zfs是天然支持的,很早的版本就支持了,另类的文件系统;
另外veritas的VxFS也是支持的,其官网有相关的解释。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/404008.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最大值池化与均值池化比较分析

1 问题在深度学习的卷积网络过程中,神经网络有卷积层,池化层,全连接层。而池化层有最大值池化和均值池化两种情况,而我们组就在思考,最大值池化和均值池化有什么区别呢?两者的模型准确率是否有所不同&#…

RTP载荷H264(实战细节)

RTP包由两部分组成,RTP头和RTP载荷: RTP头 RTP头的 结构如下: 代码结构: typedef struct RtpHdr {uint8_t cc : 4, // CSRC countx : 1, // header extendp : 1, // padding flagversion : 2; // versionuint8_t …

【Oracle 19c】解决 Oracle EM(Enterprise Manager) Express 切换回旧版后无法访问的问题

文章目录问题描述解决方案解决过程1、按 Oracle EM Express 提示下载 Adobe Flash Player PPAPI 版1、按 F12 查看 HTTP 请求头2、找到问题后使用其他浏览器尝试问题描述 由于从 Oracle Database 19c 开始,Oracle EM(Enterprise Manager) Express(Oracl…

【论文阅读】注意力机制与二维 TSP 问题

前置知识 注意力机制 见 这篇 二维 TSP 问题 给定二维平面上 nnn 个点的坐标 S{xi}i1nS\{x_i\}_{i1}^nS{xi​}i1n​,其中 xi∈[0,1]2x_i\in [0,1]^2xi​∈[0,1]2,要找到一个 1∼n1\sim n1∼n 的排列 π\piπ ,使得目标函数 L(π∣s)∥xπ…

2023年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛(同步赛) A — E

2023年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛(同步赛) 文章目录A -- A Xor B Problem题目分析codeB -- 吃苹果题目分析codeC -- n皇后问题题目分析codeD -- 分苹果题目分析codeE -- 完型填空题目分析codeA – A…

单片机——矩阵按键模块

主要目的 学会按键扫描 1.延时函数 延时函数部分详见链接: 单片机控制一盏灯的亮与灭程序解释 void delay (uint k) //定义延时函数{uint i,j;for(i<0;i<k;i){for(j0;j<113;j){;}}}这个程序里面的延时函数的目的是按键消抖。 2.按键扫描模块 这是本次实验的重点&a…

JS的执行机制

javaScript的执行机制 JS是单线程 单线程&#xff1a;所有的任务执行时需要排队&#xff0c;前一个任务结束&#xff0c;才会执行后一个任务。缺点&#xff1a;如果前一个任务耗时很长&#xff0c;后一个任务就会一直等待执行。会导致JS 执行的时间过长&#xff0c;造成页面的…

外贸建站如何提高搜索引擎排名,吸引更多潜在客户?

在如今全球贸易日益繁荣的背景下&#xff0c;越来越多的企业开始重视外贸建站&#xff0c;并寻求提高搜索引擎排名以吸引更多潜在客户。 那么&#xff0c;如何才能有效地提高外贸网站的搜索引擎排名呢&#xff1f;本文将为您详细介绍几个有效的方法。 一、关键词优化 关键词…

使用【Python】快速生成本项目的requeirments.txt

在Python项目中&#xff0c;我们通常需要使用许多第三方库来提供额外的功能和工具。但是&#xff0c;直接将这些库上传到Git仓库并不是一种好的做法&#xff0c;因为这会使得代码库变得过于臃肿&#xff0c;并且很难管理。此外&#xff0c;有时候在部署应用程序时也需要安装特定…

等价类划分法

等价类划分法 测试一个两位数的加法计算器 测试需求&#xff1a; 测试两个参数的值相加后的结果是否正确 其中&#xff1a;输入的数值在-99到99之间&#xff0c;大于99或小于-99的输入应被拒绝&#xff0c;并显示错误信息 根据测试需求&#xff0c;我们开始测试 分别给第一个…

因果图判定表法

因果图&判定表法 在了解了等价类和边界值比较适宜搭档的测试用例方法之后 接下来我们来了解另外一队就是因果图和判定表 因果图会产生判定表法 因果图法 等价类划分法和边界值分析方法都是着重考虑输入条件而不考虑输入条件的各种组合、输入条件之间的相互制约关系。例…

每天5分钟玩转机器学习算法:逆向概率的问题是什么?贝叶斯公式是如何解决的?

本文重点 前面我们已经知道了贝叶斯公式,以及贝叶斯公式在机器学习中的应用,那么贝叶斯公式究竟解决了一个什么样的问题呢?贝叶斯是为了解决逆向概率的问题。 正向的概率和逆向的概率 正向概率:假设袋子里面有N个白球,有M个黑球,你伸手一摸,那么问题就是你摸出黑球的概…

金三银四、金九银十 面试宝典 MySQL面试题 超级无敌全的面试题汇总(超万字的面试题,让你的MySQL无可挑剔)

MySQL数据库 - 面试宝典 又到了 金三银四、金九银十 的时候了&#xff0c;是时候收藏一波面试题了&#xff0c;面试题可以不学&#xff0c;但不能没有&#xff01;&#x1f941;&#x1f941;&#x1f941; 一个合格的 计算机打工人 &#xff0c;收藏夹里必须有一份 MySQL 八…

snmputilg和snmputil的下载 / Win10下SNMP服务的安装和配置

文章目录1. snmputilg和snmputil的下载2. 在Windows上安装SNMP服务3.在Windows上进行SNMP服务的相关配置4.测试是否配置成功1. snmputilg和snmputil的下载 snmputilg和snmputil的下载 该工具是学习和模拟SNMP协议的十分常用的工具。 2. 在Windows上安装SNMP服务 右键开始图标—…

【JVM篇2】垃圾回收机制

目录 一、GC的作用 申请变量的时机&销毁变量的时机 内存泄漏 垃圾回收的劣势 二、GC的工作过程 回收垃圾的过程 第一阶段&#xff1a;找垃圾/判定垃圾 方案1&#xff1a;基于引用计数(非Java语言) 引用计数方式的缺陷 方案2&#xff1a;可达性分析(基于Java语言) …

蓝桥杯嵌入式ADC与DAC(都不需要中断)

目录 1.原理图 &#xff08;1&#xff09;ADC的原理图 &#xff08;2&#xff09;DAC的原理图 2.STM32CubeMX的配置 &#xff08;1&#xff09;ADC的配置 &#xff08;2&#xff09;DAC配置 3.代码部分 &#xff08;1&#xff09;ADC代码 &#xff08;2&#xff09;DA…

【C语言深度剖析】关键字(全)

文章目录一.存储类型关键字前言补充1&#xff1a;内存思考&#xff1a;补充2&#xff1a;变量与内存的关系补充3&#xff1a;变量的分类补充4&#xff1a;存储类补充5&#xff1a;删除数据是怎么删除的&#xff1f;1.auto2.register3.static4.extern基本用法:基本功能5.typedef…

「计算机组成原理」数据的表示和运算(二)

文章目录五、奇偶校验码六、算术逻辑单元ALU6.1 电路的基本原理6.2 加法器的设计6.2.1 一位全加器6.2.2 串行加法器6.2.3 串行进位的并行加法器6.2.4 并行进位的并行加法器七、补码加减运算器八、标志位的生成九、定点数的移位运算9.1 算数移位9.2 逻辑移位9.3 循环移位五、奇偶…

Matlab生成sinc信号

Matlab生成sinc信号 在Matlab中生成sinc信号非常容易。首先&#xff0c;我们需要了解什么是sinc波形。 sinc波形是一种理想的信号&#xff0c;它在时域上是一个宽度为无穷的矩形函数&#xff0c;而在频域上则是一个平的频谱。它的公式为&#xff1a; sinc⁡(x)sin⁡(πx)πx\…

YOLOv5源码逐行超详细注释与解读(3)——训练部分train.py

前言 本篇文章主要是对YOLOv5项目的训练部分train.py。通常这个文件主要是用来读取用户自己的数据集&#xff0c;加载模型并训练。 文章代码逐行手打注释&#xff0c;每个模块都有对应讲解&#xff0c;一文帮你梳理整个代码逻辑&#xff01; 友情提示&#xff1a;全文近5万字…