MySQL高级第十三篇:MySQL事物日志(redo日志-undo日志执行流程)

news2025/1/21 18:47:12

MySQL高级第十三篇:MySQL事物日志(redo日志-undo日志执行流程)

  • 一、概述
  • 二、redo 日志
    • 1. 为什么需要 redo日志?
    • 2. redo 日志的特点
    • 3. redo log 整体流程
    • 4. redo log 的刷盘策略?
  • 三、undo 日志
    • 1. 什么是 undo 日志,有什么作用?
    • 2. undo log与undo页
    • 3. 总流程

一、概述

  • 事务有4种特性:原子性、一致性、隔离性和持久性。

  • 事务的隔离性由锁机制实现,而事务的 原子性、一致性和持久性 由事务的 redo日志 和 undo日志 来保证。

  • REDO LOG : 重做日志,提供再写入操作,恢复提交事务修改的页操作,用来保证事务的持久性。

  • UNDO LOG : 回滚日志,回滚行记录到某个特定版本,用来保证事务的原子性、一致性。

  • REDO 和 UNDO 都可以视为是一种恢复操作,区别如下:

  • redo log:是存储引擎层(innodb)生成的日志,记录的是物理级别上的页修改操作,比如某页号、某偏移量写入了什么数据,主要为了保证数据的可靠性

  • undo log:也是存储引擎层(innodb)生成的日志,记录的是逻辑操作日志,比如对某一行数据进行了INSERT语句操作,那么 undo log 就记录一条与之相反的 DELETE 操作。主要用于事务的 回滚(undo log记录的是每个修改操作的逆操作)和 一致性非锁定读

二、redo 日志

1. 为什么需要 redo日志?

  • InnoDB存储引擎是以页为单位来管理存储空间的。在真正访问页面之前,需要把在磁盘上的页缓存到内存中的 Buffer Pool之后才可以访问。

  • 所有的变更都必须先更新缓冲池中的数据,然后缓冲池中的脏页会以一定的频率被刷入磁盘(checkPoint机制),通过缓冲池来优化CPU和磁盘之间的鸿沟,这样就可以保证整体的性能不会下降太快。

  • 但是,因为checkPoint不是每次变更就触发,如果在commit之后刚写完缓冲池数据库宕机了,那么这部分数据就丢失了。

  • 这样就不能保证持久性,想要尽可能保证持久性,我们可以简单粗暴的,当内存中的数据修改了,我们就马上去更新磁盘,但是这样存在两个问题:

    • 1.InnoDB以页为单位进行磁盘IO,这就造成,当我们仅仅修改一个字节时,也不得不将一个完整的页刷新到磁盘。
    • 2.一条update语句可能修改很多页面,这些页面可能并不相邻,这时就需要进行很多的随机IO,随机IO刷新较慢
  • 怎样更好的解决上边的问题呢? 这时redo日志就来了。

  • 我们只是想要当事物提交之后,内存中的数据肯定改了,这时磁盘的数据也一定要能改。我们的思路就是不频繁刷盘,而是先将所做的修改保存到一个文件里边,这个文件起名叫做 redo日志,这样的话,就算修改内存还没来得及刷新磁盘宕机了,重启后也可以根据 redo日志 来恢复,以此来保证持久性。

  • InnoDB引擎的事务采用了WAL技术(Write-Ahead Logging),这种技术的思想就是先写日志,再写磁盘,只有日志写入成功,才算事务提交成功,这里的日志就是redo log,当发生宕机且数据未刷到磁盘的时候,可以通过redo log来恢复,以保证ACID中的D。
    在这里插入图片描述

2. redo 日志的特点

  • 降低的刷盘频率
  • 占用空间小,刷盘快
  • 顺序写入,顺序IO比随机IO快
  • 事物过程中,redo log不断记录

redo log跟bin log的区别:

redo log是存储引擎层产生的,而bin log是数据库层产生的。

一个事物过程中,会一直不断的往redo log顺序记录,而bin log不会记录,直到这个事务提交,才会一次写入到bin log文件中。

3. redo log 整体流程

redo log 整体流程大致分为四步:

  • 第1步:先将原始数据从磁盘中读入内存中来,修改数据的内存拷贝;
  • 第2步:生成一条重做日志并写入redo log buffer,记录的是数据被修改后的值;
  • 第3步:当事务commit时,将redo log buffer中的内容刷新到redo log file,对redo log file采用追加写的方式
  • 第4步:定期将内存中修改的数据刷新到磁盘中
    在这里插入图片描述

4. redo log 的刷盘策略?

redo log 的刷盘策略,指的是将redo log buffer中的内容刷新到redo log file这一步,虽然它不是真正的将数据刷新到磁盘,但是,只要这一步不出现问题,就可以保证我们的持久化成功了

redo log 的刷盘策略由 innodb_flush_log_at_trx_commit 这个参数控制,值可以为 0,1,2,代表三种策略,默认为 1。

三种策略如下:

  • 值为0:表示每次事务提交时不进行刷盘操作。(系统默认master thread每隔1s进行一次重做日志的同步)
  • 值为1:表示每次事务提交时都将进行同步刷盘操作(默认)
  • 值为2:表示每次事务提交时都只把redo log buffer内容写入page cache,不进行同步。由OS自己决定什么时候同步到磁盘文件。

三、undo 日志

1. 什么是 undo 日志,有什么作用?

  • 其实,在事物更新数据之前,有一步写入 undo log 的操作,undo log 用来保证事物的原子性。

  • 当事物执行过程中出现各种错误时,这个事物需要回滚,把数据改回原先的样子,所以就需要 undo 日志 来记录旧值。

  • 此外,undo log 的产生会伴随着 redo log 的产生,因为 undo log 也需要持久性保护。

  • undo log 的作用:

    • 1.回滚数据
    • 2.MVCC(当用户读取一行记录时,若该记录已经被其他事务占用,当前事务可以通过undo读取之前的行版本信息,以此实现非锁定读取。)

2. undo log与undo页

  • 写 undo log 时,会申请一个undo 页,在页中进行写入;
  • 但是为每一个事物分配一个页,是非常浪费内存的,所以undo页被设计为是可以重用的;
  • 当事务提交时,并不会立刻删除undo页,而是判断是否可以重用;
  • undo log 在 commit 后,会被放到一个链表中,然后判断undo页的使用空间是否小于3/4,如果小于3/4的话,则表示当前的 undo页 可以被重用,那么它就不会被回收,其他事务的 undo log 可以记录在当前undo页的后面。
  • 由于undo log是离散的,所以清理对应的磁盘空间时,效率不高。

3. 总流程

在这里插入图片描述

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

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

相关文章

1026. 节点与其祖先之间的最大差值(4-19日

题目:给定二叉树的根节点 root,找出存在于 不同 节点 A 和 B 之间的最大值 V,其中 V |A.val - B.val|,且 A 是 B 的祖先。 (如果 A 的任何子节点之一为 B,或者 A 的任何子节点是 B 的祖先,那么…

context 浅析

在缺少直接调用关系的两个函数之间传递数据,一般都会考虑使用 context,而 context 也被用来存储整个请求链路的公参信息,用户 uid、链路 traceID、特定的业务参数等。函数第一个参数类型设置为 context.Context 也是 Go 的默认写法&#xff0…

2 常见模块库(3)

2.9 积分模块(2) External reset: 在什么条件下进行外部重置操作描述一下每个选项: Rising:当重置信号从非正的值(0或负值)变为正值时,重置积分器的状态。 Falling:当重置信号从正…

Java每日一练(20230419)

目录 1. 二叉树的最大深度 🌟 2. 二叉树的层序遍历 🌟🌟 3. 最短回文串 🌟🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Jav…

双向带头循环链表的实现

双向带头循环链表 双向带头循环链表结构讲解期望实现功能创建链表和头节点作用头插和头删头插头删 尾插与尾删尾插尾删 pos 删除和插入插入删除 打印和查找 整体代码 这个数据结构可以算是YYDS的存在了。 我们前面讲过的单链表,尾删和尾插需要遍历数组,极…

是时候该换掉你的axios了

axios是一个基于Promise的HTTP客户端,每周的npm下载量4000W,如果回到在10年前,promise式的请求工具是一个很大的创新,它解决了请求繁琐的问题,在那个性能要求不那么高的年代可谓是一骑绝尘。但随着时间的推移&#xff…

【网络】UDP协议 TCP协议

🥁作者: 华丞臧. 📕​​​​专栏:【网络】 各位读者老爷如果觉得博主写的不错,请诸位多多支持(点赞收藏关注)。如果有错误的地方,欢迎在评论区指出。 推荐一款刷题网站 👉 LeetCode刷题网站 文章…

Centos7安装Elasticsearch6.4.3和Kibana6.4.3

一、下载好安装文件上传到/usr/local 二、安装Java环境 1)、解压jdk tar -zxvf jdk-8u181-linux-x64.tar.gz2)、 配置Java环境变量 vim /etc/profile 3)、profile末尾添加 export JAVA_HOME/usr/local/jdk1.8.0_181 export PATH$JAVA_HO…

【2023 · CANN训练营第一季】昇腾AI入门课(Pytorch)---昇腾AI入门课(PyTorch)微认证考试

1、下列不属于昇腾计算服务层的是() 2、AscendCL的优势包括() 3、使用AscendCL开发应用的基本流程,以下正确的是? 4、关于AscendCL初始化,以下说法不正确的是? 5、以下关于ATC工具说法正确的是 6、模型转换工具的名称是&#xf…

深入实战探究 Vue 2.7 Composition API 的强大之处

最近几年公司开发一直使用的是 Vue2.6,对于逻辑复用使用的是 Mixin 方式,但随着项目体量的增加,带了一些问题,特别是:数据混乱问题:实例上的数据属性从当前模板文件中无法查取到,存在多个 Mixin…

API 鉴权都有哪些分类,这些重点不要错过

API鉴权是保证API安全性和可用性的一项重要措施。通过API鉴权,系统可以对用户或者应用进行有效的身份认证和权限管理。一般来说,在实际开发中,我们使用以下几种API鉴权方式: 1. 基本认证 基本认证是API鉴权的一种最基本形式。此方…

如何创建Spring项目

创建Spring项目 创建一个Maven项目 这里使用的是2023版本的idea。 添加Spring框架支持 在项目的pom.xml中添加Spring支持。这里可以到中央仓库找一下。 <dependencies><!-- https://mvnrepository.com/artifact/org.springframework/spring-context --><dep…

Android Binder 图文解释和驱动源码分析

前言 最近在学习Binder&#xff0c;之前都是跳过相关细节&#xff0c;通过阅读文章对Binder有了一些认识&#xff0c;但是并没有真正理解Binder。如果要深入理解Framework的代码&#xff0c;就必须要真正理解Binder。 我学习Binder的方法&#xff1a; 一边阅读Gityuan的Bind…

视觉语言模型究竟能帮助我们完成哪些工作?

当前&#xff0c;多模式人工智能已经成为一个街谈巷议的热门话题。随着GPT-4的最近发布&#xff0c;我们看到了无数可能出现的新应用和未来技术&#xff0c;而这在六个月前是不可想象的。事实上&#xff0c;视觉语言模型对许多不同的任务都普遍有用。例如&#xff0c;您可以使用…

vmware VM虚拟机去虚拟化教程 硬件虚拟机 过鲁大师检测

一 准备工作 1. 这里演示的VM虚拟机版本是12.5.9 虚拟机系统是win7 64位 2. 用到的工具 winhex和Phoenix BIOS Editor 下载地址工具 链接&#xff1a;https://pan.baidu.com/s/1b3FfA3FyQ_lnFQSjpCGLGg?pwd1221 提取码&#xff1a;1221 3. 注意&#…

【2023 · CANN训练营第一季】昇腾AI入门课(Pytorch)---昇腾AI入门课(上)

AscendCL快速入门 AscendCL概述 AscendCL功能介绍 AscendCL基础概念解析 应用开发流程 样例代码精讲

Vivado综合参数设置

如果你正在使用Vivado开发套件进行设计&#xff0c;你会发现综合设置中提供了许多综合选项。这些选项对综合结果有着潜在的影响&#xff0c;而且能够提升设计效率。为了更好地利用这些资源&#xff0c;需要仔细研究每一个选项的功能。本文将要介绍一下Vivado的综合参数设置。 …

SpringBoot解决用户重复提交订单(方式一:通过唯一索引实现)

文章目录 前言1、方案实现1.1、给数据库表增加唯一键约束1.2、编写获取请求唯一ID的接口1.3、业务提交的时候&#xff0c;检查唯一ID 2、小结 前言 对于投入运营的软件系统&#xff08;商城、物流、工厂等&#xff09;&#xff0c;最近小编在巡检项目数据库的时候&#xff0c;发…

【场景生成与削减】基于蒙特卡洛法场景生成及启发式同步回带削减风电、光伏、负荷研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

学习笔记 -- C++性能评估工具Perf

Installation sudo apt update sudo apt install linux-tools-common查看你的内核&#xff1a; uname -r我的输出&#xff1a; $ uname -r 5.15.0-67-generic安装对应的 tools&#xff1a; sudo apt install linux-tools-5.15.0-67-genericImplementation 1、Perf List 状…