【MySQL基本功系列】第二篇 InnoDB事务提交过程深度解析

news2025/1/15 17:15:49

通过上一篇博文,我们简要了解了MySQL的运行逻辑,从用户请求到最终将数据写入磁盘的整个过程。

当数据写入磁盘时,存储引擎扮演着关键的角色,它负责实际的数据存储和检索。

在MySQL中,有多个存储引擎可供选择,每个存储引擎都具有不同的特性和适用场景,但目前最常用的存储引擎之一是InnoDB。

今天,我们将学习InnoDB存储引擎的架构设计和核心特点,以及InnoDB事务提交过程深度解析。

UPDATE users set name='张老三' WHERE id = 1

如果我们执行上述update语句,它在整个执行过程中会发生什么?

接下来,我们将围绕这个update语句,熟悉整个的执行过程。

一、InnoDB存储引擎的特性:

1. 缓冲池(Buffer Pool)

缓冲池是InnoDB内部的一个重要内存结构,用于高效管理数据库表的数据和索引的缓存。

它在内存中存储了常用的数据页,以加速数据的读取和写入。

我们要更新上述sql

这个时候,它会先找 id = 1 这行数据是否在缓冲池中,如果不在,就将这条数据从磁盘加载到缓存池中。
缓冲池
当我们此时update的时候,也是先将新的数据更新到缓冲池,再写入到磁盘。

2. undo log(回滚日志)

我们知道,事务的所有操作要么全部成功(提交),要么全部失败(回滚)。

那么事务如何回滚呢?我们就要介绍到undo log

unod log文件顾名思义,就是回滚日志。

Undo Log 记录了事务对数据所做的修改,以便在需要回滚时能够撤销或者反向执行这些修改。

就是说我们写入新的数据到内存(缓冲池之前),会把更新之前的数据,也就是说原来的数据写入undo log文件,方便回滚的时候将数据恢复到事务开始之前的状态。

当我们把要更新的那行记录从磁盘文件加载到缓冲池,同时把更新前的旧值写入undo日志文件之后,就可以正式开始更新这行记录了。
在这里插入图片描述
根据上图我们看到,InnoDB收到更新请求后,查看缓冲池中是否有要更新这条数据的缓存页,如果没有则从磁盘文件中加载到缓冲池,再将更新前的数据写入undo log,最后进行数据的更新(更新到内存)

3. Redo Log(重做日志)

现在我们已经把内存里(缓冲池)的数据进行了修改,但是磁盘上的数据还没修改。

如果这时候MySQL机器宕机了,导致内存里修改过的数据丢失,应该怎么办呢?

为了防止这种情况发生,InnoDB 存储引擎在处理事务时采用了一种称为"write-ahead logging" (WAL) 的机制。

这种机制在更内存(缓冲池)时,会同时更新 Redo Log(重做日志)。

Redo Log是用于记录数据库引擎在执行事务期间对数据所做的所有修改操作,它记录了对数据页的物理修改操作,例如在磁盘上某个位置上的某个字节被修改成什么值。

当我们提交事务时,会把操作记录到 Redo Log 中,然后再更新到磁盘。这样做的目的是在系统崩溃时,可以通过重新执行 Redo Log 中的操作来还原已提交的事务,确保数据的一致性和完整性。
在这里插入图片描述

通过上图第5步,我们看到,当事务提交时,会将Redo Log写入到磁盘中,这是InnoDB的默认策略,也有其他方式可以自己配置

它由innodb_flush_log_at_trx_commit 参数进行控制:

3.1 innodb_flush_log_at_trx_commit = 0:

事务提交时,并不会立即将事务日志刷新到磁盘,而是每秒执行一次日志刷新操作。

也就是说,提交事务之后,mysql宕机,那么此时redo日志没有刷盘,导致内存(MySQL内存)里的redo日志丢失,我们提交的事务更新的数据就丢失了。

可能会丢失最多一秒钟的事务。

3.2 innodb_flush_log_at_trx_commit = 1(默认值):

每次事务提交时,都会将事务日志立即刷新到磁盘。

这种配置提供了 最高的事务持久性 ,因为在事务提交后,日志已经被写入磁盘,即使系统崩溃,也能够最小程度地丢失数据。

3.3 innodb_flush_log_at_trx_commit = 2:

每次事务提交时,事务日志会被写入到操作系统的缓存,而不是直接刷新到磁盘。
然后,日志会被每秒钟刷新到磁盘。这样可以提高性能,同时在机器崩溃时可能会丢失最多一秒钟的事务。

所以对于数据库这样严格的系统而言,一般建议redo日志刷盘策略设置为1,保证事务提交之后,数据绝对不能丢失。

当然,我们应该根据业务需要适当调整配置。

在整个事务提交的过程中,还有一点不得不提,那就是Binlog

根据我的经历,其实在实际工作中,我们更频繁地听到的是 Binlog(归档日志)。

例如,在数据库备份、数据恢复以及通过 CDC 同步数据等方面,Binlog 扮演着至关重要的角色。

二、 Binlog()

MySQL Binlog(二进制日志)是一种记录数据库中修改操作的日志。

与上面介绍的Redo Log偏向于物理性质的重做日志不同,Binlog更倾向于逻辑性的日志。

它记录了诸如“对users表中id = 1的一行数据进行更新,更新后的值是什么”之类的逻辑操作。

Binlog不是InnoDB存储引擎特有的日志文件,而是属于MySQL服务器自身的日志文件

在事务提交时,MySQL会将修改操作先写入Redo log,以确保这些修改操作在系统崩溃或故障时不会丢失。

然后,再将事务写入binlog,以记录详细的修改操作信息,并用于数据复制和恢复。

这种顺序的执行方式是为了确保数据的一致性和可恢复性。

通过先写redo log,可以确保事务的持久性,避免数据丢失。

然后,通过写binlog可以记录详细的修改操作信息,并用于数据复制和恢复。
在这里插入图片描述

1. binlog 刷盘策略

当然,与Redo Log一样,对于Binlog日志,也有不同的同步策略。

它是通过sync_binlog参数可以控制Binlog的刷盘策略

1.1 sync_binlog=0:

sync_binlog=0是MySQL的默认值。

在提交事务时,将Binlog写入磁盘时先进入操作系统(OS)的Cache内存缓存。

这意味着Binlog首先被写入内存,而不是直接持久化到磁盘。

这样的方式在性能上更高,但在机器宕机时可能导致数据丢失。

1.2 sync_binlog=1

sync_binlog=1,在提交事务时,强制将Binlog直接写入磁盘文件,而不经过操作系统的Cache内存缓存。

这样做可以提高数据持久性,即使机器宕机,也不会丢失Binlog日志。

但是,这可能会对性能产生一定影响。

通过设置sync_binlog的不同取值,可以在数据安全性和性能之间进行权衡。

如果对数据的持久性要求较高,可以将其设置为1,确保在提交事务时Binlog立即写入磁盘。

如果更注重性能,可以使用默认值0,利用操作系统的Cache提高写入速度。

在提交了事务之后,MySQL有一个后台的IO线程,会不定期随机的把内存buffer pool中的修改后的脏数据写到磁盘中。

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

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

相关文章

免费博客搭建笔记

title: 免费博客搭建笔记 tags: 博客搭建 本次是对自己在网上学习github搭建一个 👇个人免费静态网站的总结当然不是很完美👇 Bow to the new king iYANG (yangsongl1n.github.io) 接着我会从我的写笔记的个人习惯来逐步介绍如何搭建这个网站 1.写笔…

【解决】conda-script.py: error: argument COMMAND: invalid choice: ‘activate‘

运行conda activate base报错: 试了网上找到的解决方法都不行: 最后切换了一下terminal: 从powershell改回cmd(不知道为什么一开始手贱换成powershell) 就可以了

XML解析文档解析

1.首先是我的项目结构以及我所引入的依赖&#xff1a; 2.引入的依赖&#xff1a;jdk用的是17 <properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target> </properties> <dep…

黑客技术(网络安全)-自学

前言 一、什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防…

Peter算法小课堂—八皇后问题

独立集问题&#xff1a;安排互不冲突的个体 四个斜眼枪手 bool valid(int x,int y){for(int i1;i<min(x,y);i)if(f[x-i][y-i]) return 0;for(int i1;i<min(x,N-1-y);i)if(f[x-i][yi]) return 0;return 1; } void dfs(int x,int y,int c){if(cGUNS){ans;print();return;}i…

不可否认程序员的护城河已经越来越浅了

文章目录 那些在冲击程序员护城河低代码/无代码开发平台自动化测试和部署工具AI辅助开发工具在线学习和教育平台 面临冲击&#xff0c;程序员应该怎么做深入专业知识&#xff1a;不断学习全栈技能开发解决问题的能力建立人际网络管理和领导技能 推荐阅读 技术和应用的不断发展对…

skynet学习笔记03— 服务

01、API newservice(name, ...)&#xff1a; 阻塞的形势启动一个名为 name 的新服务&#xff0c;待start函数执行完后会返回这个服务的地址。uniqueservice(name, ...)&#xff1a;针对于当前节点&#xff0c;启动一个唯一服务&#xff08;相当于单例&#xff09;&#xff0c;…

土壤含水量的计算

土壤含水量的计算 土壤水分的表示方法 一般所说的土壤水分&#xff0c;实际上是指用烘干法在105-110摄氏度温度下能从土壤中被驱逐出来的水。土壤水分含量即土壤含水量&#xff0c;它是指土壤中所含有的水分的数量。土壤含水量可以用不同的方法表示&#xff0c;最常用的表示方…

【Git】Git分支与标签掌握这些技巧让你成为合格的码农

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Git》。&#x1f3af;&#x1f3af; &#x1f449…

src/main/resources/fonts/songti.ttc not found as file or resource.

https://blog.csdn.net/Lewishhhh/article/details/122812272文章浏览阅读4.8k次&#xff0c;点赞2次&#xff0c;收藏7次。背景遇到个需求需要用Java导出PDF文件&#xff0c;权衡之下选择了iText&#xff0c;Java操作pdf的各个开源库之间的对比可以参考https://blog.csdn.net/…

论文笔记:AttnMove: History Enhanced Trajectory Recovery via AttentionalNetwork

AAAI 2021 1 intro 1.1 背景 将用户稀疏的轨迹数据恢复至细粒度的轨迹数据是十分重要的恢复稀疏轨迹数据至细粒度轨迹数据是非常困难的 已观察到的用户位置数据十分稀疏&#xff0c;使得未观察到的用户位置存在较多的不确定性真实数据中存在大量噪声&#xff0c;如何有效的挖…

大数据毕业设计选题推荐-生产大数据平台-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

Centos7安装PostgreSQL 14

环境&#xff1a; Centos7安装PostgreSQL_14版本数据库&#xff1b; 打开官方网站&#xff1a;PostgreSQL: Linux downloads (Red Hat family) 一、 版本选择 复制、粘贴并运行如下脚本&#xff1a; 二、安装步骤 这些命令是在 CentOS 7.x 系统上安装和配置 PostgreSQL 14 的步…

【机器学习范式】监督学习,无监督学习,强化学习, 半监督学习,自监督学习,迁移学习,对比分析+详解与示例代码

目录 1. 监督学习 (Supervised Learning): 2. 无监督学习 (Unsupervised Learning): 3. 强化学习 (Reinforcement Learning): 4. 半监督学习 (Semi-Supervised Learning): 5. 自监督学习 (Self-Supervised Learning): 6. 迁移学习 (Transfer Learning): 7 机器学习范式应…

Java编程--synchronized/死锁/可重入锁/内存可见性问题/wait()、notify()

前言 逆水行舟&#xff0c;不进则退&#xff01;&#xff01;&#xff01; 目录 线程安全 synchronized原子锁 可重入锁&#xff08;递归锁&#xff09; 死锁 内存可见性问题 wait()、notify() 线程安全 线程安全是指在多线程环境下&#xff0c;程序的行为表现仍然符合我…

华为ensp:静态默认路由

静态路由 到r2 上的系统视图模式 下一跳为1.1.1.2 ip route-static 192.168.2.0 255.255.255.0 1.1.1.2 如果找2网段下一跳为1.1.1.2接口 默认路由 到r3上做的是默认路由 ip route-static 0.0.0.0 0 1.1.1.1 所有的流量去找1.1.1.1 查看效果 只要做完完整的路由就可…

HIKVISION流媒体管理服务器后台任意文件读取漏洞

默认账号密码为 admin/12345 构造payload /systemLog/downFile.php?fileName../../../../../../../../../../../../../../../windows/system.ini漏洞证明 文笔生疏&#xff0c;措辞浅薄&#xff0c;望各位大佬不吝赐教&#xff0c;万分感谢。 免责声明&#xff1a;由于传播…

无需标注海量数据,目标检测新范式OVD

当前大火的多模态GPT-4在视觉能力上只具备目标识别的能力&#xff0c;还无法完成更高难度的目标检测任务。而识别出图像或视频中物体的类别、位置和大小信息&#xff0c;是现实生产中众多人工智能应用的关键&#xff0c;例如自动驾驶中的行人车辆识别、安防监控应用中的人脸锁定…

若依如何进行页面路由跳转,路由跳转时如何携带参数(超详细图文教程)

我们经常会有这样需求&#xff0c;当我们在一个页面时&#xff0c;想要跳转到另一个页面&#xff0c;但是跳转的同时还需要携带参数。那么这种情况在若依系统中该如何做呢&#xff0c;下面我们来说一下。 文章目录 问题提出&#xff1a;一、创建目标页面的路由(也就是图2的路由…