【MySQL】深入解析MySQL双写缓冲区

news2024/9/21 4:01:35

原创不易,注重版权。转载请注明原作者和原文链接

文章目录

    • 为什么需要Doublewrite Buffer
    • Doublewrite Buffer原理
    • Doublewrite Buffer和redo log
    • Doublewrite Buffer相关参数
    • 总结

在数据库系统的世界中,保障数据的完整性和稳定性是至关重要的任务。为了实现这一目标,MySQL内部使用了许多精巧而高效的机制。

InnoDB是MySQL中一种常用的事务性存储引擎,它具有很多优秀的特性。其中,Doublewrite Buffer是InnoDB的一个重要特性之一,本文将介绍Doublewrite Buffer的原理和应用,帮助读者深入理解其如何提高MySQL的数据可靠性并防止可能的数据损坏。

为什么需要Doublewrite Buffer

我们常见的服务器一般都是Linux操作系统,Linux文件系统页(OS Page)的大小默认是4KB。而MySQL的页(Page)大小默认是16KB。

可以使用如下命令查看MySQL的Page大小:

SHOW VARIABLES LIKE 'innodb_page_size';

一般情况下,其余程序因为需要跟操作系统交互,所以它们的页(Page)大小都为操作系统页大小的整数倍。比如,Oracle的Page大小为8KB。

MySQL程序是跑在Linux操作系统上的,理所当然要跟操作系统交互,所以MySQL中一页数据刷到磁盘,要写4个文件系统里的页。

如图所示:

需要注意的是,这个刷页的操作并非原子操作,比如我操作系统写到第二个页的时候,Linux机器断电了,这时候就会出现问题了。造成「页数据损坏」。并且这种页数据损坏靠 redo日志是无法修复的。

redo重做日志中记录的是对页的物理操作,而不是页面的全量记录,当发生「Partial Page Write(部分页写入)」问题时,出现问题的是未修改过的数据,此时redo日志无能为力。

Doublewrite Buffer的出现就是为了解决上面的这种情况,给InnoDB存储引擎提供了数据页的可靠性,虽然名字带了Buffer,但实际上Doublewrite Buffer是「内存+磁盘」的结构。

内存结构:Doublewrite Buffer内存结构由128个页(Page)构成,大小是2MB。

磁盘结构:Doublewrite Buffer磁盘结构在系统表空间上是128个页(2个区,extend1和extend2),大小是2MB。

Doublewrite Buffer的原理是,再把数据页写到数据文件之前,InnoDB先把它们写到一个叫「doublewrite buffer(双写缓冲区)」的共享表空间内,在写doublewrite buffer完成后,InnoDB才会把页写到数据文件适当的位置。

如果在写页的过程中发生意外崩溃,InnoDB会在doublewrite buffer中找到完好的page副本用于恢复。

Doublewrite Buffer原理

如上图所示,当有数据页要刷盘时:

  1. 页数据先通过memcpy函数拷贝至内存中的Doublewrite Buffer中。

  2. Doublewrite Buffer的内存里的数据页,会fsync刷到Doublewrite Buffer的磁盘上,分两次写入磁盘共享表空间中(连续存储,顺序写,性能很高),每次写1MB。

  3. Doublewrite Buffer的内存里的数据页,再刷到数据磁盘存储.ibd文件上(离散写)。

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

所以在正常的情况下,MySQL写数据页时,会写两遍到磁盘上,第一遍是写到doublewrite buffer,第二遍是写到真正的数据文件中,这便是「Doublewrite」的由来。

我们可以通过如下命令来监控Doublewrite Buffer工作负载,该命令用于显示有关双写缓冲区(doublewrite buffer)的统计信息。‘%dblwr%’ 是一个通配符,匹配所有包含 ‘dblwr’ 的状态变量。

show global status like '%dblwr%';

这个命令可能会产生如下格式的输出:

+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| Innodb_dblwr_writes    | 1000  |
| Innodb_dblwr_pages_written | 8000  |
+------------------------+-------+

Doublewrite Buffer和redo log

在MySQL的InnoDB存储引擎中,Redo log和Doublewrite Buffer共同工作以确保数据的持久性和恢复能力。

  1. 当有一个DML(如INSERT、UPDATE)操作发生时, InnoDB会首先将这个操作写入redo log(内存)。这些日志被称为未检查点(uncheckpointed)的redo日志。
  2. 然后,在修改内存中相应的数据页之前,需要将这些更改记录在磁盘上。但是直接把这些修改的页写到其真正的位置可能会因发生故障导致页部分更新,从而导致数据不一致。因此,InnoDB的做法是先将这些修改的页按顺序写入doublewrite buffer。这就是为什么叫做 “doublewrite” —— 数据实际上被写了两次,先在doublewrite buffer,然后在它们真正的位置。
  3. 一旦这些页被安全地写入doublewrite buffer,它们就可以按原始的顺序写回到文件系统中。即使这个过程在写回数据时发生故障,我们仍然可以从doublewrite buffer中恢复数据。
  4. 最后,当事务提交时,相关联的redo log会被写入磁盘。这样即使系统崩溃,redo log也可以用来重播(replay)事务并恢复数据库。

在系统恢复期间,InnoDB会检查doublewrite buffer,并尝试从中恢复损坏的数据页。如果doublewrite buffer中的数据是完整的,那么InnoDB就会用doublewrite buffer中的数据来更新损坏的页。否则,如果doublewrite buffer中的数据不完整,InnoDB也有可能丢弃buffer内容,重新执行那条redo log以尝试恢复数据。

所以,Redo log和Doublewrite Buffer的协作可以确保数据的完整性和持久性。如果在写入过程中发生故障,我们可以从doublewrite buffer中恢复数据,并通过redo log来进行事务的重播。

Doublewrite Buffer相关参数

以下是一些与Doublewrite Buffer相关的参数及其含义:

  • innodb_doublewrite: 这个参数用于启用或禁用双写缓冲区。设置为1时启用,设置为0时禁用, 默认值为1。
  • innodb_doublewrite_files: 这个参数定义了多少个双写文件被使用。默认值为2,有效范围从2到127。
  • innodb_doublewrite_dir: 这个参数指定了存储双写缓冲文件的目录的路径。默认为空字符串,表示将文件存储在数据目录中。
  • innodb_doublewrite_batch_size: 这个参数定义了每次批处理操作写入的字节数。默认值为0,表示InnoDB会选择最佳的批量大小。
  • innodb_doublewrite_pages:这个参数定义了每个双写文件包含多少页面。默认值为128。

总结

Doublewrite Buffer是InnoDB的一个重要特性,用于保证MySQL数据的可靠性和一致性。

它的实现原理是通过将要写入磁盘的数据先写入到Doublewrite Buffer中的内存缓存区域,然后再写入到磁盘的两个不同位置,来避免由于磁盘损坏等因素导致数据丢失或不一致的问题。

总的来说,Doublewrite Buffer对于改善数据库性能和数据完整性起着至关重要的作用。尽管其引入了一些开销,但在大多数情况下,这些成本都被其提供的安全性和可靠性所抵消。


感谢阅读,如果本篇文章有任何错误和建议,欢迎给我留言指正。

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

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

相关文章

web 基础和http 协议

一、域名 域名的概念 IP地址不易记忆,域名方便记住,以便于用户进行搜索访问 早期使用Hosts文件解析域名地址 缺点: ① 主机名称重复 ② 主机维护困难 DNS(Domain Name System)域名系统 ① 分布式 将一个大的数…

【AN-Animate教程——熟悉工作区】

【AN-Animate教程——熟悉工作区】 初始页面创建舞台主舞台界面其他常用板块 本篇内容:Animate用途 重点内容:熟悉工作区,以及基本操作 工 具:Adobe Animate 2022 初始页面 在初始页面当中,我们可以看到一个忍者和一个…

使用VS编译Redis源码报错

使用Redis源码版本,解压工程右键生成hiredis项目正常,编译Win32_Interop项目报下图错误(error C2039:system_error:不是std成员;error C3861: system_category:找不到标识符) 解决办法:在Win32_variadicFunctor.cpp和Win32_FDAPI.cpp添加 #include <system_error> ,再右键…

k8s 集群部署 kubesphere

一、最小化部署 kubesphere 1、在已有的 Kubernetes 集群上部署 KubeSphere&#xff0c;下载 YAML 文件: wget https://github.com/kubesphere/ks-installer/releases/download/v3.4.0/kubesphere-installer.yaml wget https://github.com/kubesphere/ks-installer/releases/…

204318-14-9,依多曲肽,DOTA-TOC

DOTA-[Tyr3]-Octreotide&#xff0c;依多曲肽,DOTA-(酪氨酸3)-奥曲肽是一种重要的多肽分子&#xff0c;其结构与奥曲肽类似&#xff0c;具有多种重要的药理作用。由于其具有大量的羧基官能团和醇羟基官能团&#xff0c;可以与各种放射性核素结合&#xff0c;因此被广泛应用于放…

基于springboot实现旅游网站管理平台系统项目【项目源码+论文说明】

基于springboot实现旅游网站平台管理系统演示 摘要 随着科学技术的飞速发展&#xff0c;网络快速发展、人民生活的快节奏都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;旅游管理系统当然也不能排除在外。旅游管理系统是以实际运用为开发背…

关于竞品分析怎么做?掌握这5点就够了!

大家好&#xff0c;我是设计师l1m0&#xff0c;今天要给大家分享的竞品分析相关知识。 在竞争激烈的市场中&#xff0c;了解竞争对手并且在产品开发和市场营销中制定明智的策略至关重要。这正是产品竞品分析的目的所在。本文将详细介绍如何进行产品竞品分析&#xff0c;以及通…

基于Springboot实现口腔牙诊所管理平台项目【项目源码+论文说明】计算机毕业设计

基于Springboot实现口腔牙诊所管理平台演示 摘要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;口腔管理平台当然也不能排除在外。口腔管理平台是以实际运用为开发背景&…

2024年浙大MBA项目必报名的三个理由

近期是2024年研究生考试网上报名的时间&#xff0c;每一位考生其实都要在这个时间段内最终确定自己的报考院校和专业&#xff0c;无论出于什么样的理由&#xff0c;杭州达立易考教育认为自己的选择都会直接关系到未来三年读书甚至于此生长期的影响&#xff0c;对于MBA等在职类考…

LiveGBS流媒体平台GB/T28181功能-国标设备通道分享手机PC浏览器观看直播

LiveGBS流媒体平台GB/T28181功能-国标设备通道分享手机PC浏览器观看直播 1、 国标设备列表1.1、 查看通道1.2、 开启分享1.3、访问分享页面 2、搭建GB28181视频直播平台 1、 国标设备列表 1.1、 查看通道 1.2、 开启分享 1.3、访问分享页面 2、搭建GB28181视频直播平台 支持 W…

PMP证书已经过续费期了,还有必要再考一次吗?

在3年内需要续费&#xff0c;并且还有一年的证书缓冲期。我认为除了必须要续费外&#xff0c;这并不是非常必要。 已经过去了4年&#xff0c;如果当初考证是因为需要找工作或公司的要求&#xff0c;那么项目管理知识应该已经掌握得差不多了。现在已经有了一份稳定的工作&#…

融资融券利率攻略,最低可以降至4.xx%!

对于融资融券业务而言并不是券商越大&#xff0c;排名越靠前&#xff0c;两融业务就越好&#xff0c;各家券商对两融业务的投入都是不一样的&#xff0c;差异也很大&#xff0c;能做到的最低利率也不尽相同&#xff0c;有的券商500w融资利率都只能做到5.5%&#xff0c;极个别券…

算法通关村第17关【白银】| 贪心高频问题

区间问题 1. 会议室&#xff08;判断区间是否重叠&#xff09; 思路&#xff1a;很容易理解一个人不可能同时出席两场会议&#xff0c;也就是会议时间不能重叠。先按照开始时间排序&#xff0c;逐个比较下一个会议开始时间是否大于前一个会议的结束时间 public static boolean…

计算机视觉和机器视觉有什么区别?

人工智能是一个概念性术语&#xff0c;涵盖了若干特定技术。本文中&#xff0c;我们将探讨机器视觉&#xff08;MV&#xff09;和计算机视觉&#xff08;CV&#xff09;。二者都涉及可视化输入的摄取和解释&#xff0c;因此&#xff0c;了解这些重叠技术的优势、约束和最佳应用…

oracle、mysql、postgresql数据库的几种表关联方法

简介 在数据开发过程中&#xff0c;常常需要判断几个表直接的数据包含关系&#xff0c;便需要使用到一些特定的关键词进行处理。在数据库中常见的几种关联关系&#xff0c;本文以oracle、mysql、postgresql三种做演示 创建测试数据 oracle -- 创建表 p1 CREATE TABLE p1 (tx…

智慧安防视频监控系统EasyCVR平台突然运行异常,是什么原因?

随着互联网技术的发展与视频技术的进步&#xff0c;视频监控系统EasyCVR安防视频综合管理平台支持多类型设备、多协议方式接入&#xff0c;包括市场主流标准协议国标GB28181、RTMP、RTSP/Onvif协议等&#xff0c;以及厂家私有协议&#xff0c;如海康SDK、大华SDK、海康Ehome等。…

【软件测试】路径覆盖

题目要求&#xff1a; a) 流程图如下&#xff1a; b) Consider test cases ti (n 3) and t2 ( n 5). Although these tour the same prime paths in printPrime(), they dont necessarily find the same faults. Design a simple fault that t2 would be more lik…

【深度学习实验】循环神经网络(一):循环神经网络(RNN)模型的实现与梯度裁剪

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 数据处理 2. rnn 测试 3. grad_clipping 4. 代码整合 经验是智慧之父&#xff0c;记忆是智慧之母。 ——谚语 一、实验介绍 本实验介绍了一个简单的循环神经网络…

SpringBoot Redis 基础使用

redis是一个key-value。和Memcached类似&#xff0c;它支持存储的value类型相对更多&#xff0c;包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash&#xff08;哈希类型&#xff09;。 Redis能做什么&#xff1a; 1. 缓存&#xff0c;毫无疑问这…

【设计模式】使用建造者模式组装对象并加入自定义校验

文章目录 1.前言1.1.创建对象时的痛点 2.建造者模式2.1 被建造类准备2.2.建造者类实现2.3.构建对象测试2.4.使用lombok简化建造者2.5.lombok简化建造者的缺陷 3.总结 1.前言 在我刚入行不久的时候就听说过建造者模式这种设计模式&#xff0c;当时只知道是用来组装对象&#xf…