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

news2024/10/5 13:12:05

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编程网

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

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

相关文章

论文阅读RangeDet: In Defense of Range View for LiDAR-based 3D Object Detection

文章目录 RangeDet: In Defense of Range View for LiDAR-based 3D Object Detection问题笛卡尔坐标结构图Meta-Kernel Convolution RangeDet: In Defense of Range View for LiDAR-based 3D Object Detection 论文:https://arxiv.org/pdf/2103.10039.pdf 代码&…

Python 与机器学习,在服务器使用过程中,常用的 Linux 命令包括哪些?

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 本博客旨在分享在实际开发过程中,开发者需要了解并熟练运用的 Linux 操作系统常用命令。Linux 作为一种操作系统,与 Windows 或 MacOS 并驾齐驱,尤其在服务器和开发环…

【Node.js从基础到高级运用】二十一、使用child_process模块创建子进程

引言 在Node.js中,child_process模块是一个提供了创建和管理子进程的能力的核心模块。通过使用child_process模块,Node.js可以执行系统命令、运行其他脚本或应用程序,实现与Node.js进程的并行处理。 child_process模块提供了几种创建子进程的…

环信IM集成教程——Web端UIKit快速集成与消息发送

写在前面: 千呼万唤始出来,环信Web端终于出UIKit了!🎉🎉🎉 文档地址:https://doc.easemob.com/uikit/chatuikit/web/chatuikit_overview.html 环信单群聊 UIKit 是基于环信即时通讯云 IM SDK 开…

Docker:探索容器化技术,重塑云计算时代应用交付与管理

一,引言 在云计算时代,随着开发者逐步将应用迁移至云端以减轻硬件管理负担,软件配置与环境一致性问题日益凸显。Docker的横空出世,恰好为软件开发者带来了全新的解决方案,它革新了软件的打包、分发和管理方式&#xff…

聚观早报 | 蔚来推出油车置换补贴;iPhone 16 Pro细节曝光

聚观早报每日整理最值得关注的行业重点事件,帮助大家及时了解最新行业动态,每日读报,就读聚观365资讯简报。 整理丨Cutie 4月02日消息 蔚来推出油车置换补贴 iPhone 16 Pro细节曝光 小米SU7创始版第二轮追加开售 OpenAI将在日本设立办事…

OSPF中配置静态路由实验简述

静态路由协议和OSPF(开放最短路径优先)协议是两种常见的路由协议,它们在路由选择和网络管理方面有一些区别。他们可以共存。 静态路由协议需要手动配置路由表,不会自动适应网络拓扑变化,适用于小型网络或者网络拓扑变化…

图神经网络:处理非欧几里得数据的新视角

目录 1. 引言 2.图数据与图神经网络基础 3.GNN模型详解 4.应用案例 4.1. 社交网络分析 4.2. 化学分子性质预测 5.总结 1. 引言 非欧几里得数据指的是那些不遵循传统欧几里得空间几何规则的数据。在欧几里得空间中,数据点之间的距离和形状可以通过标准的几何度…

书生·浦语大模型(学习笔记-1)

一、大模型的发展 模型与通用人工智能(AGI),大模型通常被视为发展通用人工智能的重要途径。AI研究从专用模型向通用模型转变,在过去的一二十年中,研究重点在于针对特定任务的专用模型。专用模型的已经再多个领域取得显…

试过了,ChatGPT确实不用注册就可以使用了!

看到官网说不用登录也可以直接使用ChatGPT 我们来试一下 直接打开官网 默认是直接进入了chatgpt3.5的聊天界面 之前是默认进的登录页面 聊一下试试 直接回复了,目前属于未登录状态,挺好! 来试下ChatGPT4 跳转到了登录页面 目前来看gpt4还…

时序预测 | Matlab实现CPO-LSTM【24年新算法】冠豪猪优化长短期记忆神经网络时间序列预测

时序预测 | Matlab实现CPO-LSTM【24年新算法】冠豪猪优化长短期记忆神经网络时间序列预测 目录 时序预测 | Matlab实现CPO-LSTM【24年新算法】冠豪猪优化长短期记忆神经网络时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CPO-LSTM【24年新算法】…

【Java+Springboot】----- 通过Idea快速创建SpringBoot项目操作方法

一、第一步: 点击选择【File】->【New】-> 【Project】 最后弹出[new Project]界面。 二、第二步: 1. 选择【Spring Initializr】 2. 然后选择【Project SDK】的版本 3. 然后 Choose Initializr Service URL 选择默认(Default&#x…

OpenCV项目实战-深度学习去阴影-图像去阴影

往期热门博客项目回顾: 计算机视觉项目大集合 改进的yolo目标检测-测距测速 路径规划算法 图像去雨去雾目标检测测距项目 交通标志识别项目 yolo系列-重磅yolov9界面-最新的yolo 姿态识别-3d姿态识别 深度学习小白学习路线 //正文开始! 图…

Python+requests+Pytest+logging+allure+pymysql框架详解

一、框架目录结构 1)tools目录用来放公共方法存储,如发送接口以及读取测试数据的方法,响应断言 数据库断言 前置sql等方法;2)datas目录用例存储接口用例的测试数据,我是用excel来存储的数据,文件数据 图片数据等;3)testcases目录用来存放测试用例,一个python文件对应…

linux删除 buff/cache缓存

1.查看当前内存占用 free -h如图,缓存占用了将近9G,接下来进行清理 释放页缓存 echo 1 > /proc/sys/vm/drop_caches释放dentries和inodes echo 2 > /proc/sys/vm/drop_caches释放所有缓存 echo 3 > /proc/sys/vm/drop_caches再次查看&#…

uniapp创建opendb-city-china Schema文件后,如何导入城市的数据?

1.点击opendb-city-china后面的详情,进入到gitee代码仓库 2.下载如下图所示的data.json文件 3.将本地创建的opendb-city-china.schema.json上传到云端 4.点击导入json 如果直接将data.json导入会报错,如下图所示: 5.将data.json本来的数组对象&#…

物联网行业中,我们如何选择数据库?

在当今数字化潮流中,我们面对的不仅是海量数据,更是时间的涟漪。从生产线的传感器到金融市场的交易记录,时间序列数据成为了理解事物演变和趋势的关键。在面对这样庞大而动态的数据流时,我们需要深入了解一种强大的工具——时序数…

Flutter 开发学习笔记(3):第三方UI库的引入

文章目录 前言初始化程序Icon导入如何导入 Toast消息提示框引入简单封装简单使用 Charts图表导入新建pages文件夹存放page简单代码实现效果 总结 前言 Flutter已经发布了有10年了,生态也算比较完善了。用于安卓程序开发应该是非常的方便。我们这里就接入一些简单的…

经营数据分析怎么做?企业月度经营分析的思路与方法分享

企业经营分析是企业成功的关键之一,无论企业规模大小,都需要通过系统性的数据分析来指导经营决策。这一过程不仅仅是对集团大局数据的简单处理,还包括对市场、客户、生产、财务、运营、项目进展、人效等多个方面数据的全面审视。通过深入分析…

ubuntu-server部署hive-part4-部署hive

参照 https://blog.csdn.net/qq_41946216/article/details/134345137 操作系统版本:ubuntu-server-22.04.3 虚拟机:virtualbox7.0 部署hive 下载上传 下载地址 http://archive.apache.org/dist/hive/ apache-hive-3.1.3-bin.tar.gz 以root用户上传至…