MySQL Doublewrite Buffer 有了解过吗?

news2024/11/26 3:35:26

引言:在数据库管理中,确保数据的完整性和一致性是至关重要的。然而,在持久化数据到磁盘的过程中,可能会遇到各种意外情况,如断电或系统崩溃,从而导致部分数据写入,而另一部分数据未能成功写入,这就产生了部分页面写问题。MySQL 中的 InnoDB 存储引擎为了解决这一问题,引入了 Doublewrite Buffer 机制。

题目

MySQL Doublewrite Buffer 有了解过吗?

推荐解析

Doublewrite Buffer 这玩意是啥用呢?

我们都知道 innodb 默认一页是 16K,而操作系统 Linux 内存页是 4K,那么一个 innodb 页对应 4 个系统页。

所以 innodb 的一页数据要刷盘等于需要写四个系统页,那假设一页数据落盘的时候,只写了一个系统页 就断电了,那 innodb 一页数据就坏了,然后就 g 了,恢复不了。

即产生了部分页面写问题,因为写 innodb 的一页无法保证原子性,所以引入了 Doublewrite Buffer。

其实就是当 innodb 要将数据落盘的时候,先将页数据拷贝到 Doublewrite Buffer 中,然后 Doublewrite Buffer 再刷盘到 Doublewrite Buffer Files,这时候数据已经落盘了。

然后再将数据页刷盘到本该到文件上。

从这个步骤我们得知,数据是写了两次磁盘,所以这玩意叫 double write。

之所以这样操作就是先找个地方暂存这次刷盘的完整数据,如果出现断电这种情况导致的部分页面写而损坏原先的完整页,可以从 Doublewrite Buffer Files 恢复数据。

但虽然是两次写,性能的话也不会低太多,因此数据拷贝到 Doublewrite Buffer 是内存拷贝操作,然后写到 Doublewrite Buffer Files 也是批量写,且是顺序写盘,所以整体而已,性能损失不会太多。

有了这玩意,在崩溃恢复的时候,如果发现页损坏,就可以从 Doublewrite Buffer Files 里面找到页副本,然后恢复即可。

工作流程

当执行写操作(如INSERT、UPDATE或DELETE)时,MySQL 会首先将数据写入双写缓冲区。接着,这些数据会被同步到 Doublewrite File 中,这一过程由后台线程完成以确保数据持久性。一旦 Doublewrite File 中的数据被确认写入磁盘,MySQL 就会将数据写入实际的数据文件中。如果在写操作过程中发生故障,MySQL 可以从 Doublewrite File 中恢复数据,因为这里的数据是完整的,可以用来修复损坏的数据文件,保证数据的完整性和一致性。

好处

1)数据完整性保障: Double Write Buffer确保了数据的完整性,即使在写操作过程中发生故障,也能够从Double Write Buffer中恢复数据。这种机制有效地防止了数据损坏或丢失,提高了数据库的可靠性。

2)性能优化**:** 虽然Double Write Buffer会增加写入操作的开销,但它通过批量写入和顺序写入的方式提高了性能。它允许后台线程异步地将数据写入Double Write Buffer和Double Write File,从而减少了写操作对数据库性能的影响。

3)减少碎片写入: Double Write Buffer的使用减少了碎片写入的可能性,因为它会将数据收集到一起批量写入到Double Write File中。这有助于提高磁盘利用率和写入效率。

4)提高恢复速度**:** 在数据库恢复过程中,可以利用Double Write Buffer中的数据快速修复损坏的数据文件,而无需执行完整的数据恢复过程。这样可以显著缩短数据库恢复的时间,减少业务中断的风险。

其他补充

鱼聪明 AI 的回答:

鱼聪明 AI 地址:https://www.yucongming.com/

MySQL实现Double Write Buffer的方式是将数据首先写入到内存中的Double Write Buffer中,然后再将其同步到磁盘上的Double Write File中。这个过程是由后台线程完成的,确保数据的持久性和完整性。

除了Double Write Buffer,还有一些其他的方案可以提高写入操作的性能和可靠性,例如:

  1. Write-Ahead Logging (WAL):WAL是一种常见的技术,通过先将修改操作记录到日志文件中,然后再将其应用到数据文件中,来确保数据的持久性和完整性。WAL可以减少数据文件的随机写入,提高写入性能。
  2. 数据页级别的校验和:一些数据库系统在数据页中添加校验和,可以在写入时检测到数据页的损坏,从而提高数据的完整性。
  3. 闪存缓冲区(Flashcache):一些数据库系统使用闪存缓冲区来加速写入操作。闪存缓冲区可以在内存和磁盘之间缓存数据,减少随机写入,提高写入性能。
  4. 其他缓冲技术:还有一些其他的缓冲技术,如缓存写入(Write-back Cache)和延迟写入(Lazy Write),可以在一定程度上提高写入性能,但需要权衡数据的持久性和性能之间的关系。

总的来说,Double Write Buffer是MySQL实现数据写入的一种重要机制,但也可以结合其他方案来提高写入性能和数据完整性。

欢迎交流

Double Write Buffer 属于执行一条 SQL 语句的最后一个步骤,结合三个日志,可以去想一想执行流程,总共大概有 15 个流程,能够完整答出来肯定是很加分的,在文末还剩三个问题,欢迎小伙伴在评论区留言!

1)Double Write Buffer的性能损失情况是如何评估的?在哪些情况下,性能损失可能会更为显著?

2)Double Write Buffer如何与MySQL的日志系统(如redo log和binlog)相互作用?它们之间有什么区别和联系?

3)对于高并发写入的场景,Double Write Buffer可能会带来哪些挑战?有什么优化策略可以应对这些挑战?

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

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

相关文章

eclipse怎么导入python项目

python项目导入eclipse的步骤: 1、首先,打开Eclipse集成开发程序,在菜单栏上点击“File(F)”,在弹出来的列表中点击“导入(I)...”。 2、在弹出来的“导入”窗口中,选择“常规”选项中的“现有…

QT学习过程中遇到的问题自记

文章目录 前言问题1问题2问题3 前言 学习QT嵌入式实战开发(从串口通信到JSON通信微课视频版)的过程中遇到的几个小问题 问题1 1.将书中的示例代码导入自己的电脑,然后点击工程进去,不能运行,报错 no kits are enabled for this project… 我…

[数据集][目标检测]数据集VOC格式岸边垂钓钓鱼fishing目标检测数据集-4330张

数据集格式:Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件,仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数):4330 标注数量(xml文件个数):4330 标注类别数:1 标注类别名称:["fishing"] 每…

小程序自定义marker弹出框教程

需求背景 微信小程序开发,需要使用腾讯地图显示自定义marker,并且点击marker后弹出自定义的customCallout,并且customCallout的内容为用户点击marker的时候再从后台接口获取数据。 百度了一圈后发现居然没有一篇文章可以一次性完成&#xf…

pESC-HIS是什么,怎么看?-实验操作系列-2

01 典型的pESC-HIS质粒遗传图谱 02 介绍 质粒类型:酿酒酵母蛋白表达载体 表达水平:高拷贝 诱导方法:半乳糖 启动子:GAL1和GAL10 克隆方法:多克隆位点,限制性内切酶 载体大小:6706bp 5 测…

uniapp封装picker选择器组件,支持关键字查询

CommonPicker.vue组件 路径在 components\CommonPicker.vue <template><view><uni-easyinput v-model"searchQuery" :placeholder"placeholder" /><picker :range"filteredOptions" :range-key"text" v-model&…

韩顺平0基础学java——第18天

p374-395 类变量和类方法 类变量&#xff08;静态变量&#xff09; 例&#xff1a; class Child{ public static Int count&#xff1b;//这个count可以被所有Child实例共享 /..../ } 内存中&#xff0c;static在堆中是独立存放的&#xff0c;并不在某个对象的空间中。 由于…

行业分析---造车新势力之理想汽车

1 前言 在之前的博客中&#xff0c;笔者撰写了多篇行业类分析的文章&#xff08;科技新能源&#xff09;&#xff1a; 《行业分析---我眼中的Apple Inc.》 《行业分析---马斯克的Tesla》 《行业分析---造车新势力之蔚来汽车》 《行业分析---造车新势力之小鹏汽车》 此类文章的受…

前端传参数后端变量类型能够接受到List却无法接收到值

问题描述 今天写了个接口&#xff0c;下图所示 ReqVO里是这样的&#xff1a; 然后前端去请求&#xff0c;从请求结果中看发现这里值是在的&#xff08;有经验的可能就看出来了otherInfo.id: 这样以参数后端是接收不到的&#xff0c;但是当时没发现&#xff09; 传进来后端…

zynq-7015启动分析及裸机BootLoader编写(未完待续)

使用lwip-tcp远程对QSPI进行更新、QSPI FLASH启动 W25Q128资料&#xff1a; W25Q128JV datasheet(1/78 Pages) WINBOND | 3V 128M-bit serial flash memory with dual/quad spi (alldatasheet.com) UG585资料&#xff1a; Zynq 7000 SoC Technical Reference Manual-UG585 翻译…

python3 -m http.server 检查打包前端的项目

python3 -m http.server这是 Python 提供的一个内置的简单 HTTP 服务器。当你在终端中运行 python3 -m http.server 命令时(在对应的打包目录比如dist目录)&#xff0c;Python 会启动一个 HTTP 服务器&#xff0c;它会将当前工作目录下的文件作为静态文件提供给浏览器。这个服务…

张大哥笔记:高考,万人过独木桥,你怕不怕摔倒?

今天刷到一个新闻&#xff1a;宁夏煤业计划招600名挖煤的井下操作工&#xff0c;要求大学学历&#xff01;结果却吸引了7900人来报名&#xff01;我都惊呆了&#xff0c;什么时候挖煤都要求这么高的学历了&#xff0c;那读书到底起啥作用&#xff01; 如果一个人读书读到大学后…

web刷题记录(4)

[GKCTF 2020]cve版签到 进来应该是给了个提示了&#xff0c;就是要以.ctfhub.com结尾 还有一个超链接&#xff0c;这题的ssrf还是挺明显的&#xff0c;抓包看看 发现回显里面有提示 说是和本地有关&#xff0c;那么也就是说&#xff0c;要访问127.0.0.1&#xff0c;大概意思就…

基于FPGA的任意点滑动平均(滑动窗长度和数据位宽参数化,例化时参数可设置)

目录 1.前言2.原理3.举例说明4.Matlab实现5.FPGA实现滑动平均 微信公众号获取更多FPGA相关源码&#xff1a; 1.前言 对于一维信号&#xff0c;我们可以使用类似移动平均滤波&#xff08;Moving Average Filtering&#xff09;实现denoising。Moving Average Filtering 是一种…

超速解读多模态InternVL-Chat1.5 ,如何做到开源SOTA——非官方首发核心技巧版(待修订)

解读InternVL-chat1.5系列 最近并行是事情太杂乱了&#xff0c;静下心来看一看优秀的开源项目,但是AI技术迭代这么快&#xff0c;现在基本是同时看五、六个方向的技术架构和代码&#xff0c;哪个我都不想放&#xff0c;都想知道原理和代码细节&#xff0c;还要自己训练起来&am…

性能飙升50%,react-virtualized-list如何优化大数据集滚动渲染

在处理大规模数据集渲染时&#xff0c;前端性能常常面临巨大的挑战。本文将探讨 react-virtualized-list 库如何通过虚拟化技术和 Intersection Observer API&#xff0c;实现前端渲染性能飙升 50% 的突破&#xff01;除此之外&#xff0c;我们一同探究下该库还支持哪些新的特性…

【嵌入式DIY实例】-OLED显示天气数据

OLED显示天气数据 文章目录 OLED显示天气数据1、硬件准备与接线2、天气数据获取准备3、代码实现在这个物联网项目中,本文将展示如何使用 ESP8266 NodeMCU (ESP-12E) Wi-Fi 开发板和 SSD1306 OLED 显示屏(12864 像素)制作一个简单的互联网气象站。 NodeMCU 从天气网站 openwe…

JavaWeb3 Ajax+Axios+Element+Nginx部署

Ajax 异步JS和XML 1.数据交换&#xff1a;给服务器发送请求&#xff0c;并获取服务器相应的数据 2.异步交互&#xff1a;在不重新加载整个页面的情况下&#xff0c;与服务器交换数据并更新部分网页 同步与异步 原生Ajax <!DOCTYPE html> <html> <body><…

kafka-消费者-消费异常处理(SpringBoot整合Kafka)

文章目录 1、消费异常处理1.1、application.yml配置1.2、注册异常处理器1.3、消费者使用异常处理器1.4、创建生产者发送消息1.5、创建SpringBoot启动类1.6、屏蔽 kafka debug 日志 logback.xml1.7、引入spring-kafka依赖1.8、消费者控制台&#xff1a;1.8.1、第一次启动SpringK…

【WP】猿人学_17_天杀的Http2.0

https://match.yuanrenxue.cn/match/17 抓包分析 居然对Fiddler有检测&#xff0c;不允许使用 那就使用浏览器抓包&#xff0c;好像没发现什么加密参数&#xff0c;然后重放也可以成功&#xff0c;时间长了也无需刷新页面&#xff0c;尝试Python复现。 Python复现 import …