深入解析MySQL双写缓冲区(Doublewrite Buffer):原理及作用

这篇具有很好参考价值的文章主要介绍了深入解析MySQL双写缓冲区(Doublewrite Buffer):原理及作用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MySQL的InnoDB存储引擎以其卓越的事务处理和数据完整性保护能力而受到广泛赞誉。在这些特性中,Doublewrite Buffer作为一个关键组件,确保了数据的完整性和可靠性。在这篇文章中,我们将深入探讨Doublewrite Buffer的原理、作用及其在MySQL中的重要地位。

1️⃣什么是Double write Buffer

Doublewrite Buffer是MySQL数据库中InnoDB存储引擎的一种机制,用于解决部分写失效的问题,提高数据完整性和可靠性。Doublewrite Buffer是内存+磁盘的结构,包括内存结构和磁盘结构两个部分。

  • 在内存结构中,Doublewrite Buffer由128个页(Page)构成,大小是2MB。这些页在内存中以Doublewrite Buffer的形式存在。

  • 在磁盘结构中,Doublewrite Buffer在系统表空间上是128个页(2个区,extend1和extend2),大小也是2MB。这些页在磁盘上以Doublewrite File的形式存在。

Doublewrite Buffer的原理是在将数据页写到数据文件之前,先将它们写入Doublewrite Buffer的共享表空间内。在完成写入Doublewrite Buffer后,再将数据页写入到数据文件的适当位置。这种方式可以确保数据的一致性和完整性,因为在写入过程中发生意外崩溃时,可以从Doublewrite Buffer中找到完好的数据页副本用于恢复。

深入解析MySQL双写缓冲区(Doublewrite Buffer):原理及作用,DB,mysql,数据库,spring cloud,微服务,java,jvm,dba

当有数据页要被写入数据文件时,首先将页数据通过memcpy函数拷贝至内存中的Doublewrite Buffer中。然后,Doublewrite Buffer的内存中的数据页会刷写到Doublewrite Buffer的磁盘上,分两次写入磁盘共享表空间中(连续存储,顺序写,性能很高),每次写1MB。完成Doublewrite页的写入之后,再将内存中的Doublewrite Buffer中的页写入到自己的表空间文件中。

通过这种方式,至少在两次写操作中,数据文件和Doublewrite Buffer文件中至少有一份数据是正确无误的。如果写磁盘过程发生了崩溃,那么MySQL重启时可以通过校验和来确认是否有错误数据,如果Doublewrite Buffer文件错误了,就从数据文件中拉取原始数据根据redo log得出正确的目标数据,而如果数据文件错误了,则将Doublewrite Buffer中的数据重新写入数据文件。

2️⃣Doublewrite Buffer工作流程

  1. 写操作触发: 当执行INSERT、UPDATE或DELETE等写操作时,MySQL首先将数据写入双写缓冲区。
  2. 同步到Doublewrite File: 随后,双写缓冲区中的数据被同步(flush)到Doublewrite File中。这个过程是由后台线程完成的,以确保数据的持久性。
  3. 实际数据写入: 一旦Doublewrite File中的数据被确认已经写入磁盘,MySQL就可以将这些数据写入实际的数据文件中。
  4. 恢复机制: 如果在写操作过程中发生故障,MySQL可以从Doublewrite File中恢复数据。由于Doublewrite File中的数据是完整的,因此可以用来修复损坏的数据文件,确保数据的完整性和一致性。

3️⃣为什么需要Doublewrite Buffer

从MySQL页(Page)和Linux页大小不同的角度来看,需要Doublewrite Buffer的原因主要是为了解决数据写入过程中的一致性和完整性问题。

首先,我们需要了解MySQL的页和Linux的页大小不同。MySQL的页通常大小为16KB,而Linux的页大小可能因系统配置而有所不同,但常见的默认大小是4KB。这意味着,当MySQL写入一个页的数据时,实际上是写入了一个更大的块,这个块可能跨越了多个Linux页。
深入解析MySQL双写缓冲区(Doublewrite Buffer):原理及作用,DB,mysql,数据库,spring cloud,微服务,java,jvm,dba

现在,考虑以下场景:

假设MySQL正在写入一个页的数据,并且这个操作只完成了部分,比如只写入了50%的数据。在这种情况下,如果直接将这个不完整的数据页写入数据文件,那么数据文件就会处于一个不一致的状态。某些查询可能会读取到这个不完整的数据页,导致数据损坏或不一致。

为了解决这个问题,Doublewrite Buffer被引入。当MySQL写入一个数据页时,首先会将整个页写入Doublewrite Buffer。这样,即使写操作只完成了部分,Doublewrite Buffer中的数据仍然是完整的。然后,Doublewrite Buffer中的数据再被同步(flush)到实际的数据文件中。这样,即使发生故障,也可以从Doublewrite Buffer中恢复数据,确保数据的完整性和一致性。

综上所述,Doublewrite Buffer的存在是为了解决由于MySQL页和Linux页大小不同导致的数据写入过程中的一致性和完整性问题。通过将数据先写入Doublewrite Buffer,然后再同步到实际的数据文件,可以确保数据的完整性和一致性,避免因故障导致的数据损坏或不一致问题。

4️⃣Doublewrite Buffer的参数

MySQL的双写缓冲区可以通过以下参数进行配置:文章来源地址https://www.toymoban.com/news/detail-814977.html

  • innodb_doublewrite: 控制是否启用双写缓冲区的参数。可以设置为ON或OFF。默认为ON。
  • innodb_doublewrite_file: 指定Doublewrite File的路径和文件名。默认值为ib_logfile0和ib_logfile1。
  • innodb_doublewrite_buffer_size: 控制双写缓冲区大小的参数。默认值为256KB。可以根据需要进行调整,但不应设置得过大或过小,以免影响系统性能或导致不必要的内存占用。

到了这里,关于深入解析MySQL双写缓冲区(Doublewrite Buffer):原理及作用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL 存储引擎 InnoDB 内存结构之更改缓冲区

    更改缓冲区(Change Buffer)是一种特殊的数据结构,用于缓存不在缓冲池中的二级索引(secondary index)页的更改。可能来自于 INSERT 、 UPDATE 或 DELETE 操作(数据操作语言,DML)的缓冲更改,会在后续通过其他读操作将这些页加载到缓冲池时被合并。 与聚簇索引(clustered indexe

    2024年02月10日
    浏览(40)
  • C++环形缓冲区设计与实现:从原理到应用的全方位解析

    环形缓冲区(Circular Buffer),也被称为循环缓冲区(Cyclic Buffer)或者环形队列(Ring Buffer),是一种数据结构类型,它在内存中形成一个环形的存储空间。环形缓冲区的特点是其终点和起点是相连的,形成一个环状结构。这种数据结构在处理流数据和实现数据缓存等场景中具

    2024年02月07日
    浏览(61)
  • 8.缓冲区管理

    双缓冲区:TC+M 假设初始状态缓冲区1满,缓冲区2空,工作区为空。 刚开始缓冲区2为空,所以设备可以向缓冲区2中冲入数据耗时T,另一方面刚开始缓冲区1中是满的,所以刚开始就可以把缓冲区1中的数据传送到工作区中,M时刻工作区被充满,CPU就开始处理数据耗时C,处理完

    2024年02月11日
    浏览(42)
  • Redis 缓冲区

    缓冲区的应用场景 : 客户端与服务器端的通信时,暂存客户端发送的命令数据,或暂存服务器端返给客户端的数据结果 主从节点间进行数据同步时,暂存主节点接收的写命令和数据 缓冲区 : 避免客户端和服务器端的请求发送和处理速度不匹配 服务器给每个连接的客户端都准

    2024年02月07日
    浏览(69)
  • 理解缓冲区

    对于这样的代码,首先可以肯定的是 printf 语句先于 sleep 执行,既然如此那么就应该是先打印语句然后进行休眠,下面看看结果: 但这里却是先休眠以后再打印语句,这是因为存在一个叫缓冲区的东西,当我们要向外设写入数据(让显示器显示就是向显示器写入数据)时会将

    2023年04月25日
    浏览(72)
  • 【Linux】理解缓冲区

    我们发现 printf 和 fwrite (库函数)都输出了2次,而 write 只输出了一次(系统调用)。为什么呢?肯定和fork有关! C接口的函数被打印了两次系统接口前后只是打印了一次:和fork函数有关,fork会创建子进程。在创建子进程的时候,数据会被处理成两份,父子进程发生写时拷

    2024年01月23日
    浏览(54)
  • 【Linux】文件缓冲区

    提到文件缓冲区这个概念我们好像并不陌生,但是我们对于这个概念好像又是模糊的存在脑海中,之间我们在介绍c语言文件操作已经简单的提过这个概念,今天我们不妨深入理解什么是文件缓冲区 通过自己实现库中的一些文件操作函数更加深入的理解文件缓冲区 自定义实现

    2024年02月10日
    浏览(58)
  • C/C++缓冲区

    什么是缓冲区? 程序和磁盘文件之间不能直接交换数据,必须通过内存中一个被称为文件缓冲区的区域来中转。ANSIC标准规定,系统会自动为每个正在使用的文件在内存中开辟一个缓冲区,缓冲区的大小随机器而异。 缓冲区有什么作用? 假设我们在家中休息看电视吃零食,

    2024年02月15日
    浏览(50)
  • SEED-缓冲区溢出攻击

    实验环境:SEED-Ubuntu20.04虚拟机 a) 缓冲区溢出原理 **缓冲区溢出攻击原理:**利用溢出的数据改变源程序的控制流,如覆盖返回地址 b) 分析生成badfile文件的exploit.py程序 Shellcode部分 字节数组末尾处填入shellcode c) 编译目标服务器上具有缓冲区溢出漏洞的stack.c程序,并将其缓冲

    2024年02月07日
    浏览(45)
  • 【linux】重定向+缓冲区

    自我名言 : 只有努力,才能追逐梦想,只有努力,才不会欺骗自己。 喜欢的点赞,收藏,关注一下把! close(1),为什么没有打印新建文件fd呢? printf(“%dn”,fd); printf会把内容打印到stdout文件中。 但是close(1)关闭标准输出stdout—显示器,int fd=open();新打开的文件fd是1。 st

    2024年02月08日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包