一次MySQL事务的旅程:Buffer Pool, Binlog, Redo Log揭秘

MySQL中的各种Buffer和Log以及表空间

MySQL中一次事务涉及了各种Buffer,Log和表空间,主要涉及:Buffer Pool, Binlog, Undo Log, Redo Log以及表空间。

我们来探讨下。

Buffer Pool

Buffer Pool主要存放在内存中,它是一个缓存区域,用来缓存InnoDB读取的数据页和索引页。此外,它也暂存了那些待写入磁盘的修改后的数据页,也就是“脏页”。

file

Buffer Pool关键词:LRU,配置一大堆,步步惊心。

  1. Binlog (Binary Log):
    Binlog不是InnoDB特有的,而是MySQL数据库的一种日志系统,它记录了所有修改数据库数据的SQL语句及其执行的时间点。Binlog主要用于复制和数据恢复。Binlog信息首先存储在内存中,然后会定期刷新到磁盘文件中去。

file

Binlog关键词 WAL, 复制, 数据持久性,硬盘转个不停,高性能SSD可能也不行

Undo Log:

Undo Log用来保存数据修改前的信息。它存在于内存中,并且可以被部分持久化到磁盘上。Undo Log主要用于事务的回滚,以及提供多版本并发控制(MVCC)时所需的行数据的旧版本。

file

file

Undo Log MVCC, 事务回滚, 保存旧数据 返璞归真

Redo Log:

Redo Log记录了事务所做的更改,可以在系统崩溃后用于数据的恢复。Redo Log在实现起来通常分为两个部分,一部分是在内存中维护的缓冲区(Redo Log Buffer),另外一部分则是磁盘上的文件(Redo Log Files)。Redo Log Buffer中的内容会定期刷新到Redo Log Files以确保数据的持久性。

file

Redo Log关键词:WAL, Crash Recovery, 保护新数据,活力四射的硬盘,SSD的挑战者

事务过程

在事务操作期间, 以上的Buffer,Log和表空间保证了事务的ACID特性(原子性、一致性、隔离性、持久性)。内存是用于快速数据访问和处理的,而日志文件(Binlog和Redo Log Files)和Undo信息的持久化存储位于磁盘上,用来确保数据在系统崩溃后能够恢复。通过将内存计算与磁盘持久化结合,MySQL能够在保证性能,同事保证数据的完整性和可靠性。

在MySQL中,一个事务的过程一般会涉及以下步骤:

开始一个事务

用户发起一个事务(例如,执行START TRANSACTION;),此时事务开始。

读取和修改数据

用户读取和修改数据时,InnoDB首先从Buffer Pool查找所需的数据页。如果数据页不在Buffer Pool中,则从磁盘加载数据页到Buffer Pool。修改数据时,InnoDB会将更改写入Buffer Pool中的数据页,并将这些修改作为“脏页”标记。

写入Undo Log

在内存中,InnoDB记录Undo Log以保存数据修改前的状态。Undo Log在事务过程中可能会持续增加,在事务提交之前,一部分或全部Undo Log可以持久化到磁盘上,以支持可能的事务回滚或系统崩溃后的数据恢复。

记录Redo Log

同时,InnoDB会在内存的Redo Log Buffer中记录Redo Log,详细记录数据页的修改操作。这些日志信息是事务的一部分,并且最重要的是,事务提交前,这些Redo Log会被刷写(flush)到磁盘上的Redo Log Files中,以保证事务的持久性,这就是著名的Write-Ahead Logging(WAL)技术。

写入Binlog

如果启用了Binlog(比如在MySQL主从复制配置中),MySQL服务器层会将修改操作记录到Binlog Cache中,事务提交时,Binlog Cache中的内容会被写入到磁盘上的Binlog文件中,确保记录了修改数据库的所有操作。

提交事务

当用户执行COMMIT;命令提交事务,发生以下动作:

  • Redo Log Buffer中与该事务相关的日志被刷写到磁盘上的Redo Log Files,这步操作是确保数据持久性的重要一步。
  • Binlog在提交之前也被刷写到磁盘,这确保了急停(如电源突然中断)的情况下,已提交的事务能够通过Redo Log和Binlog恢复。
  • 一旦Redo Log和Binlog都写入了磁盘,事务就被认为是成功提交了,此时,即使系统崩溃,已提交的事务也不会丢失。

清理和维护

在事务提交后,InnoDB可能会清理Undo Log,释放资源。同时,后台进程会负责将Buffer Pool中的脏页异步地刷写到磁盘上,此过程被称为Checkpointing。它不是立即发生的,而是根据InnoDB的配置和当前的系统负载情况进行调整的。这样做的好处是可以批量写入数据,并且分摊I/O压力。

刷盘时机

  • Redo Log刷盘:事务提交时,为保证事务的持久性。
  • Binlog刷盘:事务提交时,用于确保数据可以复制或恢复。
  • Buffer Pool刷盘:通过后台Checkpoint或者主动Flush操作,不一定与事务提交同步。

file

通过这个流程,可以看到InnoDB事务处理中不同组件的作用:

  • Buffer Pool: 提高数据操作效率,避免频繁磁盘I/O。
  • Undo Log: 提供事务回滚,支持多版本并发控制(MVCC)。
  • Redo Log: 确保事务的原子性和持久性,帮助恢复未提交的数据修改。
  • Binlog: 用于数据的复制和恢复工作,但不是InnoDB特有的,属于MySQL Server层的组件。
  • 表空间(Tablespace): 存储数据及索引的物理文件。

MySQL会丢数据吗?

在事务提交时,确实涉及Redo Log和Binlog的写入到磁盘,但是否是“实时”取决于具体配置。以下是更详细的解释:

  1. Redo Log 写入磁盘:
    InnoDB使用Write-Ahead Logging (WAL) 机制。在事务提交时,它会确保所有的Redo Log记录至少已经写入了Redo Log Buffer,并且要求这些记录在事务被认为已提交之前写入磁盘。控制这个行为的MySQL配置参数是innodb_flush_log_at_trx_commit,来看一下每个值对应的策略:
选项值说明MySQL 8 默认值
0对Redo Log的刷写会在每秒进行一次,这种设置在性能与数据安全之间提供了折衷方案。如果发生崩溃,可能会丢失最近一秒内的改动。
1每次事务提交时都将Redo Log从缓冲区刷写到磁盘。这提供了最高级别的数据持久性,但可能会对性能产生影响,因为涉及到更频繁的磁盘IO操作。默认
2Redo Log会被定期地,但不是在每个事务提交时,从缓冲区刷写到磁盘。这种设置提高了性能,但如果发生崩溃,可能会导致最近一秒内的事务数据丢失。

file

  1. Binlog 写入磁盘:
    Binlog的写入行为是由sync_binlog配置参数控制的。
选项值说明MySQL 8 默认值
0提交事务时不会强制刷新Binlog,而是依赖操作系统的刷写策略。这种设置在性能上有所优势,但在系统崩溃时可能会导致Binlog丢失,因此在数据安全性方面有所妥协。No
1每个事务的Binlog都会被刷写到磁盘。这在数据安全性方面提供了最高的保证,但可能会对性能产生影响由于涉及频繁的磁盘IO操作。Yes
N (>1)每N次事务才会刷写一次Binlog到磁盘。这种设置可以减少磁盘I/O,提升性能,但同时也增加了数据丢失的风险。具体的N值应根据具体的业务需求和硬件性能进行调整。No

file

答案

MySQL在事务成功提交后是不会丢数据的,但是如果你调整了这两个参数那么就有可能丢失事务数据。

参考

MySQL 牺牲性能产出的ACID – FOF编程网

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

36---USB HUB电路设计

视频链接 USB HUB电路设计01_哔哩哔哩_bilibili USB HUB 电路设计 1、USB HUB基本介绍 USB Hub,指的是一种可以将一个USB接口扩展为多个,并可以使这些接口同时使用的装置。 Hub也是大家常说的集线器,它使用星型拓扑结构连接多个USB接口设…

【御控物联】JavaScript JSON结构转换(17):数组To对象——键值互换属性重组

文章目录 一、JSON结构转换是什么?二、核心构件之转换映射三、案例之《JSON数组 To JSON对象》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么? JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换…

vue 条件渲染、列表循环渲染、事件绑定 初探第三天

条件渲染 <script>const app Vue.createApp({data(){return {show:true,conditionOne: false,conditionTwo: true,}},template:<div v-if"show"> hello word </div><div v-if"conditionOne"> if </div><div v-else…

HWOD:将字符串中的数字用*括起来

一、知识点 当需要类似括号( )这样成对出现的字符时&#xff0c;可以通过设置flag来标示 比如flag等于0表示前面所有的括号都是成对的 flag等于1表示最靠近的括号是未成对的&#xff1b;满足条件时&#xff0c;补齐括号&#xff0c;使其成对&#xff0c;flag置0 二、题目 …

如何展示科技产品的原理和应用

一、合理安排展示区域 不同的科技产品具有不同的展示需求&#xff0c;设计师需要根据展品的特点和大小&#xff0c;合理安排展示区域。对于较大的科技产品&#xff0c;可以设置特定的展台或展示区域&#xff0c;并配备合适的灯光和装饰&#xff0c;以凸显产品的重要性和独特性。…

matlab实现决策树可视化——信息增益、C4.5、基尼指数

代码&#xff1a;https://download.csdn.net/download/boyas/89074326

第十五章 Nginx

一、Nginx 1.1 Nginx 相关概念 1.1.1 正向代理 正向代理类似一个跳板机&#xff0c;代理访问外部资源。 比如我们国内访问谷歌&#xff0c;直接访问访问不到&#xff0c;我们可以通过一个正向代理服务器&#xff0c;请求发到代理服&#xff0c;代理服务器能够访问谷歌&am…

iOS开发进阶(十三):脚手架创建iOS项目

文章目录 一、前言二、xcode-select 命令三、拓展阅读 一、前言 项目初期&#xff0c;需要搭建项目基本框架&#xff0c;为此离不开辅助工具&#xff0c;即脚手架。当然&#xff0c;IDE也可以实现新建空白项目&#xff0c;但是其新建后的项目结构可能不符合预期设计&#xff0…

【论文阅读】Transformer 论文逐段精读

Transformer 论文逐段精读【论文精读】 文章目录 Transformer 论文逐段精读【论文精读】&#x1f4dd;摘要&#x1f4dc;结论&#x1f4cc;引言⏱️相关工作⭐模型Overview3.1 Encoder and Decoder Stacks3.2 Attention3.2.1 Scaled Dot-Product Attention3.3.2 Multi-head att…

如何系统地自学Python

1、如何系统地自学Python 小白的话可以快速过一下某马&#xff0c;某谷。 主要关注Python有什么集合&#xff0c;里面的集合怎么使用 然后再找一个Python爬虫实战视频&#xff0c;先跟着视频敲一遍代码&#xff0c;然后再尝试自己做一遍 然后再找一个Python服务开发视频&am…

FPGA + 图像处理 (二) RGB转YUV色域、转灰度图及仿真

前言 具体关于色域的知识就不细说了&#xff0c;简单来讲YUV中Y通道可以理解为就是图像的灰度图&#xff0c;因此&#xff0c;将RGB转化为YUV是求彩色图的灰度直方图、进行二值化操作等的基础。 HDMI时序生成模块 这里先介绍一下仿真时用于生成HDMI时序&#xff0c;用这个时…

Flutter 开发学习笔记(4):widget布局容器学习

文章目录 前言相关链接Widget 有状态和无状态Flutter 代码风格去掉烦人的括号后缀提示代码缩进 Flutter 布局最简单的布局widgets和Material widgets Dark语法习惯Flutter 布局默认布局Center居中Padding 填充Align对齐默认居中顶部底部右上角 通用 WidgetContainer处于性能原因…

波奇学Linux:tcp滑动窗口

连接建立成功和上层有没有accept没有关系 listen的第一个参数为1&#xff0c;建立的连接数量为2 操作系统底层用队列来管理建立的连接&#xff0c;上层用accept来获取链接 blacklog1 表示底层已经建立好的连接队列的最大长度 超过最大长度的连接&#xff0c;服务端不会丢弃…

STM32CubeMX配置步骤详解零 —— 引言

引子 初识 笔者接触STM32系列MCU有些年头了。初次接触是2015年&#xff0c;那时是在第二空间&#xff08;北京&#xff09;科技有限公司上班&#xff0c;是以STM32F407&#xff08;后缀好像是RGT6或ZGT6&#xff0c;记得不是很清楚了&#xff09;为主芯片做VR头戴式设备&…

SpringBoot整合Activiti7——实战之出差流程(分支)

文章目录 代码实现部署流程启动流程查询任务填写出差审批单经理审批xml文件 出差流程&#xff1a;开始 - 填写出差表单 - 判断&#xff08;出差天数大于等于5&#xff09;- 副经理审批 - 否则总经理审批 - 完成 代码实现 部署流程 Testpublic void testDeployProcess() throws …

物联网实战--入门篇之(九)安卓QT--开发框架

目录 一、QT简介 二、开发环境 三、编码风格 四、设计框架 五、总结 一、QT简介 QT是一款以C为基础的开发工具&#xff0c;已经包含了很多常用的库&#xff0c;除了基本的GUI以外&#xff0c;还有网络、数据库、多媒体、进程通信、串口、蓝牙等常用库&#xff0c;开发起来…

mysql 正则表达式查询

学习了mysql 连接查询和子查询和myql join连接&#xff0c;接下来学习下正则表达式查询。正则表达式的规则都是相似的。 8&#xff0c;使用正则表达式查询 正则表达式通常被用来检索或替换那些符合某个模式的文本内容,根据指定的匹配模式匹配文本中符合要求的特殊字符串。例如从…

绿色wordpress外贸建站模板

绿色wordpress外贸建站模板 https://www.mymoban.com/wordpress/6.html

PAC下的ROP问题

Armv8.3-A引入了pointer authentication选项。 pointer authentication可以减轻ROP攻击。 为了防止ROP攻击&#xff0c;在函数开始时&#xff0c;LR寄存器中的返回地址被签名。这意味着在寄存器的高位添加了一个PAC。在返回之前&#xff0c;使用PAC对返回地址进行验证。如果检查…

Linux 环境下 Redis基础配置及开机自启

Linux 环境下 Redis基础配置及开机自启 linux环境安装redis<redis-6.0.5.tar.gz> 1-redis基本安装配置 解压 获取到tar包后&#xff0c;解压到相关目录&#xff0c;一般是将redis目录放在usr/local/redis目录下&#xff0c;可以使用-C指定到解压下目录 tar -zvxf re…