首页 > 数据库 >MySQL--为什么有了redo log还需要double write buffer机制?

MySQL--为什么有了redo log还需要double write buffer机制?

时间:2025-01-21 22:57:19浏览次数:3  
标签:log -- double write buffer 磁盘 redo

  我们知道,数据页被加载到内存中,经过增删改一系列的操作后,并不会立即落盘,而是由后台线程选择某个合适的时机写入磁盘。在数据页尚未落盘时,如果这时MySQL突然崩溃或者断电,内存中的数据将全部丢失。这时,redo log就可以发挥其作用了,只要重放redo log就可以恢复事务。

  但是,MySQL的buffer一页的大小是16K,底层文件系统一页的大小是4K,换句话说,MySQL将一页buffer数据刷入磁盘,需要写到4个文件系统里的页。

  假如MySQL内存中的一页数据准备刷入磁盘,才刷了2个(p1和p2)到文件系统里的页,这个时候停电或者机器宕机,当机器恢复后,buffer的页数据完整性已经遭到破坏,页发生了损坏,这时即使重放redo log也无法解决这样的问题了。因为这时页数据的结构很有可能已经改变(比如中间插入或删除了几条数据),而redo log是逻辑日志,记录的是哪个数据页的哪行记录做了什么更改,这时重放redo log没有任何意义,因为前后对应的记录大概率不是同一条了。
  那么这时候,double write buffer的作用就体现出来了。MySQL在刷盘时,先将内存中的页数据写入内存中的double write buffer,然后将buffer中的数据先写入磁盘中的double write buffer文件,然后再写到磁盘中的数据页中,这就是(DoubleWrite)的由来。double write buffer中记录的是物理日志,即数据页的每条行数据。

故障分析:

1、如果系统在写入double Write Buffer前崩溃,那么重放redo log;
2、如果系统在写入磁盘的double write buffer时崩溃,说明还未写入磁盘中真正的数据页,重放redo log;
3、如果系统在写入到磁盘真正的数据页时崩溃,那么用double write buffer中的副本更新该数据页。

标签:log,--,double,write,buffer,磁盘,redo
From: https://blog.csdn.net/2301_77948840/article/details/145270924

相关文章

  • 七.网络模型
    最小(支撑)树问题最小部分树求解:破圈法:任取一圈,去掉圈中最长边,直到无圈;加边法:取图G的n个孤立点{v1,v2,…,vn}作为一个支撑图,从最短边开始往支撑图中添加,见圈回避,直到连通(有n-1条边)最短路问题求最短路有两种算法:求从某一点至其它各点之间最短离的狄克斯屈拉(Dijkstra)算法......
  • Python运算符
    1、算术运算符加+ 减—  乘* 除/ 整除// 取余% 幂运算**优先级:第1级:**第2级:*,/,%,//第3级;+,-print("加",1+4)print("减",8-19)print("乘",8*3)print("除",8/3)print("整除",8//3)print("取余",8%3)print(......
  • 定时器中断
    Timer定时器对输入得到时钟进行计数,在计数达到设定值时触发中断。时基单元=计数器+预分频器+自动重装寄存器 定时器功能:(1)定时中断功能、内外时钟源选择(2)输出比较(3)输入捕获/主从触发模式(4)编码器接口 定时器分类: 基本定时器+通用定时器+高级定时器STM32F103......
  • 网站向顾客发送电子邮件
        首先说一下,针对顾客未登录就可下单这个功能,为了使用户可以实时知晓货品的物流状态,使用了advanceshipmenttracking这个插件,这个插件不仅可以显示货品的物流信息,还可以在货品物流状态更新时向顾客发送电子邮件,这样就实现了顾客在未登录时就可以知道自己购买的商品的物......
  • How to implement a software layer
    HowLayersShouldBeRealizedThematterofhowlayersshouldberealizedisdeterminedbytheclient-servernatureoftherelationshipbetweenanapplicationanditsplatform/virtualmachine.Thisincludessomecharacteristicsoflayersdiscussedpreviou......
  • 昆明理工大学计算机891考研复试经验
    我记得当时是用了一个抽题的软件,老师会随机抽题给你回答,英语翻译中方英和英翻中,翻译有点难,然后是有数据结构,如二叉树,还有数据库的内容,如事务,还有就是计算机网络的内容,抽题忘了几道,应该有七八道的样子,然后就是老师提问,当时我记得老师提问比较多的也是数据库和计算机网络,最后老师会......
  • Linux性能分析
    sudoyuminstall-yepel-releasesudoyumupdate-ysudoyumgroupinstall-y"Developmenttools"sudoyuminstall-yelfutils-libelf-develcmake3gitbisonflexncurses-develsudoyuminstall-yluajitluajit-devel#forLuasupportcurl-LOh......
  • 2025/1/21学习
    #include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e5+10;intMax,Min,n,t;inta[N],b[N];boolcheck(intx){intlim=Max-x;intL=-1,R;for(inti=1;i<=n;++i){b[i]=a[i];if(a[i]<li......
  • 【Linux网络】深入理解linux内核网络性能优化
    一、网络请求优化1.1减少不必要的网络IO在系统设计与开发过程中,应尽量避免不必要的网络I/O操作,尤其是在可以通过本地进程或内存内完成的场景下,避免使用网络通信来实现。网络虽然是现代分布式系统中的核心组件,能够连接不同模块、简化开发流程,并支持大规模系统的构建,但滥用网络会......
  • 带 `$` 符号的 Redis 密码在 Flink 调度脚本中被截断的解决方案 WRONGPASS invalid us
    在实际生产使用中,如果你的Redis密码中包含$符号,而你又通过调度脚本(如DolphinScheduler)或Shell参数方式传递给Flink,就可能造成密码被部分截断,进而导致:WRONGPASSinvalidusername-passwordpairoruserisdisabled这是因为Shell解释$为变量展开符,后续字符被当作环......