为什么数据不会丢,InnoDB的Double Write,你必须知道

MySQL8.0后的double write有什么变化 一部分是内存中的double write buffer ,大小为2MB(16k一个页,一共128个页)。第二部分是磁盘共享表空间的128个数据页,在对脏页进行落盘的时候,并不是直接进行落盘,而是先复制到double write buffer,然后再分别写入到共享表空间,然后再写入表空间。 阅读详情

前序

InnoDB引擎有几个重点特性,为其带来了更好的性能和可靠性:

  • 插入缓冲(Insert Buffer)

  • 两次写(Double Write)

  • 自适应哈希索引(Adaptive Hash Index)

  • 异步IO(Async IO)

  • 刷新邻接页(Flush Neighbor Page)

今天我们的主题就是 两次写(Double Write), 先一句话概括下:

上一次我们讲过Insert Buffer 是用来提高存储引擎性能上的提升,Double Write 就是为了在数据库崩溃恢复时保证数据不丢失的一个重要特性,保证了数据的可靠性。

概念点

如图,还是先来说几个基础的概念:

  • 数据库表空间由段(segment)、区(extent)、页(page)组成

  • 默认情况下有一个共享表空间ibdata1,如使用了innodb_file_per_table则每张表独立表空间(指存放数据、索引、插入缓冲bitmap页)

  • 段包括了数据段(B+树的叶子结点)、索引段、回滚段

  • 区,由连续的页组成,任何情况下每个区都为1M,一个区中有64个连续页(16k)

  • 页,数据页(B-tree Node)默认大小为16KB

  • 文件系统一页 默认大小为4KB

  • 盘片被分为许多扇形的区域,每个区域叫一个扇区,硬盘中每个扇区的大小固定为512字节

  • 脏页,当数据从磁盘加载到缓冲池的数据页后,数据页内容被修改后,此数据页称为脏页

出现的问题

通过上次讲的 重要,知识点:InnoDB的插入缓冲 我们知道,脏页会在某些场景下进行刷盘,将缓冲池内的脏页数据落地到磁盘。

因为存储引擎缓冲池内的数据页大小默认为16KB,而文件系统一页大小为4KB,所以在进行刷盘操作时,就有可能发生如下场景:

如图所示,数据库准备刷新脏页时,需要四次IO才能将16KB的数据页刷入磁盘。

但当执行完第二次IO时,数据库发生意外宕机,导致此时才刷了2个文件系统里的页,这种情况被称为写失效(partial page write)。

此时重启后,磁盘上就是不完整的数据页,就算使用redo log也是无法进行恢复的。

注意:

  • redo log无法恢复数据页损坏的问题,恢复必须是数据页正常并且redo log正常。

  • 这里要知道一点,redo log中记录的是对页的物理操作,如偏移量600,写'xxxx'记录。

  • 如果这个页本身已经发生了损坏,再对其进行重做是没有意义的

该怎么解决这个问题

那应该怎么来解决这个问题呢?其实大家想一下就会有个大概的答案,就是给它搞个备份呗。

如果写脏页的时候发生宕机,在重启后使用下备份先恢复下数据页在写磁盘就可以了,其实这就是Double Write 。

Double Write 出现

千呼万唤始出来,为了防止我们可怜的数据被破坏,InnoDB存储引擎提供了重要的Double Write 特性,避免了数据丢失的惨剧发生。

下面我们来慢慢的来看看Double Write 到底是怎么提高可靠性的

Double Write 解决的问题

在数据库进行脏页刷新时,如果此时宕机,有可能会导致磁盘数据页损坏,丢失我们重要的数据。此时就算重做日志也是无法进行恢复的,因为重做日志记录的是对页的物理修改。

其实就是在重做日志前,用户需要一个页的副本,当写入失效发生时,先通过页的副本来还原该页,再进行重做,这就是double write。

Double Write 架构

如图,其实Double Write 分为了两个组成部分:

  • 内存中的double write buffer
  • 物理磁盘上共享表空间中连续的128个页,即2个区(extent),大小同样为2MB

可以看出,有了Double write后的脏页刷新流程就是多了几步操作:

  1. 在对缓冲池的脏页进行刷新时,并不直接写磁盘,而是会通过memcpy函数将脏页先复制到内存中的Double write buffer

  2. 通过Double write buffer再分两次,每次1MB顺序地写入共享表空间的物理磁盘上,然后马上调用fsync函数,同步磁盘,避免缓冲写带来的问题

Double write崩溃恢复

如图,如果操作系统在将页写入磁盘的过程中发生了崩溃,在恢复过程中,InnoDB存储引擎可以从共享表空间中的Double write中找到该页的一个副本,将其复制到表空间文件,再应用重做日志。

下面显示了一个由Double write进行恢复的情况:

090923 12:36:32 mysqld restarted
090923 12:26:33 InnoDB: Database was not shut down normally!
InnoDB: Starting crash recovery.
InnoDB: Reading tablespace information from the .ibd files...
InnoDB: Crash recovery may have faild for some .ibd files!
InnoDB: Restoring possible half-written data pages from the doublewrite.
InnoDB: buffer...
复制代码

Double Write 的问题

Double write buffer 它是在物理文件上的一个buffer, 其实也就是file,所以它会导致系统有更多的fsync操作,而因为硬盘的fsync性能问题,所以也会影响到数据库的整体性能。

Double write页是连续的,因此这个过程是顺序写的,开销并不是很大。

在完成Double write页的写入后,再将Double write buffer中的页写入各个数据文件中,此时的写入则是离散的

总结

  1. 当commit 一个修改语句时,如果redo log有空闲区域,直接写redo log,如果redo log没有空闲区域,那么需要把被覆盖的redo log对应的数据页刷新到data file 中,最后改pool buffer中的记录

  2. innodb的redo log 不会记录完整的一页数据,因为这样日志太大,它只会记录那次(sequence)如何操作了(update,insert)哪页(page)的哪行(row)

  3. 因为数据库使用的页(page,默认16KB)大小和操作系统对磁盘的操作页(page,默认4KB)不一样,当提交了一个页需要刷新到磁盘,会有多次IO, 此时刷了前面的8k时异常发生宕机。在系统恢复正常后,如果没有double write机制,此时数据库磁盘内的数据页已损坏,无法使用redo log进行恢复。

  4. 如果有double write buffer,会检查double writer的数据的完整性,如果不完整直接丢弃double write buffer内容,重新执行那条redo log,如果double write buffer的数据是完整的,用double writer buffer的数据更新该数据页,跳过该redo log。

 

详解MySQL两次写的设计及实现 两次写(InnoDBDoubleWrite)是Innodb中很独特的一个功能点。因为Innodb中的日志是逻辑的,所谓逻辑就是比如插入一条记录时,它可能会在某一个页面(这条记录最终被插入的位置)的多个偏移位置写入某个长度的值,例如页头的记录数、槽数、页尾槽数据、页中的记录值等。这些本是一些物理操作,而Innodb为了节省日志量及其它原因,设计为逻辑处理的方式,即在一个页面上插入一条记录时,对应的日志内容包括表空间号、页面号、将被记录的各个列的值等内容,在真正物理插入的时候,才会将日志逻辑操作转换为前面的物理操作。先有逻辑日志,再有物理操作,但是这样需要有一个前提,就是物理操作的页面是正确的。如 立即下载

相关推荐

C语言—for循环打印矩形,正三角形,倒三角形,九九乘法,等腰三角形,倒着的等腰三角形(简易版代码)(重点考察for循环嵌套)

本章节教大家如何利用for循环打印正三角形,倒三角形,九九乘法表及等腰三角形(简易版代码)说明:1、循环语句的循环体内又包含另一个完整的循环结构,称为循环结构的嵌套。内嵌的循环语句中还可以再嵌套循环结构,这样就形成多重循环结构的嵌套。2、for 语句、while 语句和 do-while 语句都允许嵌套。三种循环语句可以相互嵌套。3、内层的循环语句必须完全被包含在外层的循环体中,不能发生交叉。

m0_63501145的博客 1697

mysql中每页最少两条数据_MySQL源码:为什么INNODB数据页面中最少存储2条记录?...

写在前面:我一直认为数据库中已经规定,一个页面中至少要存储2条记录,但是前几天碰到一个问题:为什么INNODB数据页面中最少存储2条记录?一下子把我问住了,知道是这样,但从没有问过自己这是为什么,所以我一直想这个问题,现在刨根问底,终于知道为什么了,下面就把这个问题的原因说一下吧。在INNODB中,底层数据的存储是通过B+树实现的,一个页面的大小一般设置为16K,不同页面之间通过父子、兄弟挂链,形...

weixin_42533120的博客 1847

STM32F4驱动海康工业相机实战:从PWM信号到精准触发拍照(附完整代码)

本文详细介绍了如何使用STM32F4开发板驱动海康工业相机,实现PWM信号精准触发拍照的完整方案。从硬件连接到PWM信号生成,再到相机触发配置与延迟补偿,提供了实战经验和完整代码,帮助开发者解决工业相机硬件触发中的关键问题。

weixin_33716941的博客 699

mysql 两次写理解_详解MySQL两次写的设计及实现

编辑推荐:本文来自于cnblogs,本文主要介绍了MySQL两次写的两种方法独一个页面刷盘和批量页面刷盘的相关知识,希望能对您有所帮助。一 . 两次写提出的背景或要解决的问题两次写(InnoDB Double Write)是Innodb中很独特的一个功能点。因为Innodb中的日志是逻辑的,所谓逻辑就是比如插入一条记录时,它可能会在某一个页面(这条记录最终被插入的位置)的多个偏移位置写入某个长度的...

weixin_33506900的博客 1187

Pico设备手势追踪实战:5步搞定MRTK3手部模型与UI交互配置

本文详细介绍了在Pico设备上使用MRTK3实现手势追踪的5个关键步骤,包括环境配置、手部模型冲突解决、射线交互优化、UI交互配置及性能优化。通过实战案例和代码示例,帮助开发者快速解决MR开发中的常见问题,提升混合现实应用的交互体验。

onion的博客 500

VBA中如何使用Edge内核Browser?

在微软宣布停止对IE的支持后,许多使用VBA中Web Browser的用户遇到了困境,因为Web Browser使用的IE内核。然而微软并没有给出支持Edge的新版Web Browser,网上许多第三方的库也不够完善。经过调研,libEdge可以较好的和VBA集成,实现在Excel中打开Browser,甚至能够通过执行js代码,获取web页面的信息。项目需要WebView2Loader.dll和LibEdge.dll两个库,区分x86和x64版本。

金木AI 2401

Mysql 数据、日志、配置文件

在前文中,我们基于Mysql 8.0创建了管理用户、程序用户和数据库,使用innodb存储引擎创建了表格。mysql数据目录下生成了一些文件,本文将介绍这些文件有哪些含义和作用。 数据文件和日志文件 我们除了配置文件之外的其他数据库文件为数据文件和日志文件。不同数据库存储这些文件的位置可能不同。同一个数据库存储这些文件根据配置也可能在多个位置。我们仅以mysql 8.0的/var/lib/mysql为例。 bash-4.4# pwd /var/lib/mysql bash-4.4# ls '#i

1035

自动驾驶预测决策规划八股

预测规划八股个人总结。

dawushixiange的博客 479

MySQL 基础知识梳理学习(五)----详解MySQL两次写的设计及实现

一 . 两次写提出的背景或要解决的问题 两次写(InnoDB Double Write)是Innodb中很独特的一个功能点。因为Innodb中的日志是逻辑的,所谓逻辑就是比如插入一条记录时,它可能会在某一个页面(这条记录最终被插入的位置)的多个偏移位置写入某个长度的值,例如页头的记录数、槽数、页尾槽数据、页中的记录值等。这些本是一些物理操作,而Innodb为了节省日志量及其它原因,设...

weixin_30517001的博客 169

GLM-5.2模型自部署实战:如何通过量化与vLLM优化实现远超官方API的推理速度

在大模型应用开发中,模型推理速度是影响用户体验和系统性能的核心指标。其原理在于通过优化计算图、内存管理和并行计算来提升吞吐量与降低延迟。技术价值体现在能够为高并发、低延迟的实时应用提供稳定高效的AI服务能力,广泛应用于智能客服、代码生成、内容创作等场景。其中,模型量化通过降低权重精度(如INT4/INT8)来大幅减少显存占用和计算量,而推理引擎(如vLLM)则通过连续批处理和PagedAttention等技术最大化硬件利用率。本文聚焦于GLM-5.2模型,详细阐述如何通过量化技术与vLLM推理引擎的深度优化

weixin_29032337的博客 319

利用AWVS进行反制

awvs 10.5下载 http://www.32r.com/soft/12986.html

渗透之路,攻防之间皆学问 6654

mysql:InnoDB关键特性:两次写

一、问题引入 当发生数据库宕机时,可能InnoDB存储引擎正在写入某个页到表中,而这个页只写了一部分,比如16KB的页,只写了前4KB,之后就发生了宕机,这种情况被称为部分写失效(partial page write)。在InnoDB存储引擎未使用doublewrite技术前,曾经出现过因为部分写失效而导致数据丢失的情况。 有经验的DBA也许会想,如果发生写失效,可以通过重做日志进行恢复。这是一个办法。但是必须清楚地认识到,重做日志中记录的是对页的物理操作,如偏移量800,写’aaaa’记录。如果这个页本身

wangdamingll的博客 375

【图像去噪】论文复现:CLIP用于图像去噪提升泛化性!CLIPDenoising的Pytorch源码复现,跑通CLIPDenoising全流程,图文结合,网络结构梳理和拆解,对应源码注释!

论文题目:Transfer CLIP for Generalizable Image Denoising —— 用于可泛化图像去噪的转移CLIP。【图像去噪】论文精读:Transfer CLIP for Generalizable Image Denoising(CLIPDenoising)CLIPDenoising理论部分详解见上面对应的论文精读,本文以源码为主,理论部分只是粗略回顾。启发:多看其他领域的文章,分析是否能应用在去噪领域,这是产生idea的要素之一;

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1415

MySQL为什么有了redolog还需要double write buffer?

我们知道MySQL InnoDB引擎使用redolog作为异常容灾恢复的机制,当MySQL进程发生异常退出、机器断电等,在重新启动时,使用redolog恢复。OK,redolog是被MySQL设计为异常崩溃恢复的,double write buffer同样是为了保证数据完整性,那么既然已经有了redolog,为什么还需要double write buffer(双写缓冲区)呢?

wtopps的专栏 2856

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

MySQL InnoDB特性:Double Write

MySQL InnoDB特性:Double Write

听雪楼主 2004

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

我理解的MySQL Double Write

本文简要的介绍了MySQL中关于DoubleWrite的原理,以及实现过程。

renfengjun 9655

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

MySQL Innodb redo log,double write,buffer pool一些关系

这两天做double write的开启与关闭的xing'n

tntdb的专栏 2347

InnoDB Double write

记得刚开始看InnoDB文档的时候,Double Write一节(其实只有一小段)就让我很困惑。无奈当时内力太浅,纠缠了很久也没弄明白。时隔几个月,重新来整理一下。 涉及到的概念:Buffer Pool简称BP,Dirty Page,Log file,Flush,innodb tablespace。 1. 什么是Double Write 在InnoDB将BP中的Dirty Page刷(flu...

weixin_30257433的博客 134

mysql innodb double write概念汇总

double write原理图如下: 通过引入doublewrite buffer的方案,每次innodb在准备写出一个page时,先把page写到doublewrite buffer中.如果在写doublewrite buffer时,发生了意外,但是数据文件中的原来的page不受影响,这样在下次启动时,可以通过innodb的redolog进行恢复.如果在写doublewrite buffe...

Data & Analysis 533

InnoDB之Double write buffer

参考资料: 参考视频https://www.bilibili.com/video/BV1jA411A7qo?p=129 参考文章(墙裂推荐)https://blog.youkuaiyun.com/liuxiao723846/article/details/103509226 发现问题: 上文我们知道,InnoDB buffer pool是16kb为一页,但是操作系统从内存到磁盘是4kb为一页进行存储的。所以,InnoDB内存中的数据页,要持久化到磁盘中时,需要分成4个4KB的系统页,逐一持久化到 但是4个.

qq_23095607的博客 791

MySQL数据落盘原理(redo、undo、binlog、2PC、double write等。)

本文对MySQL的落盘过程做了由浅到深,由简单到复杂的分析,建议先对redo、undo、binlog、2PC、double write等概念了解后再看本文,会有不一样的收获

weixin_38597669的博客 4044

innodb一页为什么要存储两行记录_敲黑板:InnoDB的Double Write,你必须知道

作者:架构技术专栏出处:https://www.cnblogs.com/jiagoujishu/p/13921590.html前序InnoDB引擎有几个重点特性,为其带来了更好的性能和可靠性:插入缓冲(Insert Buffer)两次写(Double Write)自适应哈希索引(Adaptive Hash Index)异步IO(Async IO)刷新邻接页(Flush Neighbor Page)...

weixin_39722070的博客 248

mysql Innodb关键特性之两次写 Double Write

如果说Insert buffer带给innodb存储引擎的是性能上的提升,那么double write带给innodb 存储引擎的是数据页的可靠性。 当发生数据库宕机时候,innodb存储引擎可能正在写入某个页到列表中,而这个页只写了一部分,比如16K的页,只写了4K,之后就发生了宕机,这种情况下部分写失效(partial page write)。之前未使用double write技术之前曾经发生过部分写失效而导致数据丢失情况。 如果发生页写失效,是否可以通过重做日志来进行恢复,这是一个办法,但是重做日

大龄程序员 253

Innodb Double Write

Innodb使用的一种非常有趣的技术是称为“doublewrite”的技术。这意味着Innodb在执行表空间写入时会写入两次数据 - 对日志文件的写入只执行一次。 那么为什么需要双写呢?在部分页面写入的情况下,需要存档数据安全性。Innodb不会将完整页面记录到日志文件中,而是使用所谓的“生理”日志记录,这意味着日志记录包含操作的页码以及操作数据(即更新行)和日志序列信息。这种日志记录结构是ge...

weixin_30414305的博客 118

InnoDB的Double Write理解

InnoDB的Double Write理解一、什么是Double Write二、Double Write的实现方法三、error-log 中记录的利用double write恢复的过程: 题外话 此文为转载文章,转载地址:https://blog.youkuaiyun.com/leonpenn/article/details/73176601 一、什么是Double Write 当InnoDB表的数据有修改时,先更新 InnoDB Buffer Pool 中所在的页,并将此操作记录到redo log中,此时这些页在

南风TaT的博客 443
上一篇: 强烈推荐!Alibaba面经分享:spring+jvm+并发编程等(已拿offer)
下一篇: 京东T8大佬限时分享数据结构与算法手册,简直刷新了我的认知
java架构师小芷
博客等级 码龄6年 216粉丝 519原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值