第74讲:MySQL数据库InnoDB存储引擎事务:Redo Log与Undo Logo的核心概念

news2024/11/25 23:27:14

文章目录

    • 1.InnoDB引擎中的逻辑存储结构
    • 2.事务的基本概念
    • 3.Redo log的核心概念
      • 3.1.什么是Redo log
      • 3.2.如果没有redo log面临的问题
      • 3.3.使用redo log之后是怎样的流程
    • 4.Undo log的核心概念

1.InnoDB引擎中的逻辑存储结构

InnoDB存储引擎的逻辑结构分为以下几层:

  • TableSpace:表空间

    • 表空间是InnoDB存储引擎逻辑结构中的最高层,如果开启了innodb_file_per_table参数,那么每张表都会有一个表空间文件(xxx.ibd),在一个MySQL实例中可以对应多个表空间,表空间用于存储行数据以及索引数据。
    • 在表空间中可以包含多个Segment段。
  • Segment:段

    • 表空间就是由很多个段组成的,分为数据段、索引段、回滚段。
    • InnoDB是索引来组织表的,数据段就是B+树的叶子节点,叶子节点中包含的是表中的每一条数据,索引段是B+树结构中的非叶子节点,非叶子节点中记录的都是索引元素。
  • Extent:区

    • 区是表空间中的单元结构,每个区的固定大小为1M,一个区中会有很多个页,默认情况中,InnoDB存储引擎页的大小为16KB,因此一个区中一共有64个连接的页。
  • Page:页

    • 页是InnoDB存储引擎在磁盘管理中最小的单元,每个页的大小为16KB,为了保证页的连续性,InnoDB存储引擎每次会从磁盘中申请4-5个区,每个页下又拥有很多个行。
    • 页的上层是区,一个区中可以包含64个页,每次页需要的4-5个区,都是从区中申请的。
  • Row:行

    • InnoDB存储引擎是面向行的,也就是说数据时安装行进行存放的,在每一行中除了定义表的所有字段外,还包含Trxid和roll pointer两个隐藏的字段。
    • Trx_id:每次对某条记录进行改动时,将对应的事务id赋值给trx_id作为隐藏列。
    • Roll_pointer:每次对某条记录进行改动时,都会将旧版本的数据写入到undo日志中,这个隐藏列相当于一个指针,可以通过这个指针来找到记录被修改前的数据。

image-20220524215923977

2.事务的基本概念

事务指的是一组操作的集合,事务会把集合中所有的操作看成是一个整体,一起向数据库提交这些操作,或者撤销这些操作,这些操作可以是增加数据、修改数据、插入数据、查询数据,但是这一个集合中的所有操作必须要么全部成功,要么全部失败。

事务的重点概念就是:要么全部执行成功、要么全部执行失败。

事务这种操作经常应用于银行、金融等业务场景,只要涉及金额、交易等这类场景,就需要用到事务操作。

事务的四大特性分别是原子性、一致性、隔离性、持久性。

  • 原子性(Atomicity):事务是不可分割的最小操作单元,事务里的多个操作单元,要么全部执行成功,要么全部执行失败。
  • 一致性(Consistency):事务完成时,所有的数据都保持一致的状态,以转账场景为例,一旦提交事务后,转账双方的金额变化必须符合业务逻辑,小明余额减1000元,小红余额就必须加1000元,数据要保持一致状态。
  • 隔离性(Isolation):数据库系统提供事务的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行,在很多场景下,会有多个事务同时对一个数据表进行操作,此时有了隔离机制,事务A运行的时候并不会影响事务B的运行。
  • 持久性(Durability):事务一旦提交或者回滚后,对于数据库的数据改变将是永久性的,数据都会被写入到磁盘中。

我们研究事务的原理时,主要研究InnoDB引擎如何保证事务的四大特性的。

对于事务的四大特性,实际上是分为两个部分的,其中原子性、一致性、持久性是由InnoDB中的redo log日志和undo log日志来保证的。而隔离性是通过数据库中的锁加上MVCC来保证。

下面我们重点来讲解redo log和undo log。隔离性中的MVCC放在下一篇详细讲解。

redo log主要是将事务提交之后的数据写入到redo log日志文件中,用于数据的持久化或者数据恢复。

undo log主要是将事务提交之前的数据写入到undo log日志文件中,当事务回滚时会从这里读取数据。

事务的原子性由undo log日志保障,持久性由redo log日志保障,一致性由undo log和redo log保障,隔离性由锁+MVCC保障。

3.Redo log的核心概念

3.1.什么是Redo log

redo log称为重做日志,在redo log中记录的是事务提交时数据页的物理修改,所有事务提交时的数据都会记录在redo log中,用来实现事务的持久性。

redo log日志由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log file),前者是在内存中存放,后者在磁盘中存放,当事务提交之后,会把事务提交后所有的修改信息都保存到redo log中,当刷新脏页到磁盘发送错误时,可以通过redo log进行数据的恢复。

3.2.如果没有redo log面临的问题

在InnoDB存储引擎中分为内存结构和磁盘结构,在内存结构中的主要区域就是Buffer Pool缓冲池了,在缓冲池中会有很多个数据页,数据最终是要写在磁盘进行持久化的。

当我们通过一个事务执行多个增删改的操作时,InnoDB存储引擎首先会操作缓冲池中的数据,如果缓冲池中没有我们要操作的数据,那么会通过后台线程从磁盘中将要操作的数据加载到缓冲池中进行缓存,然后由事务操作缓冲池中的数据,数据被修改后,所在的数据页我们就会称为脏页,脏页会在一定的时机,通过后台线程将数据刷新到磁盘中,从而保证缓冲区和磁盘的数据是一致的,保证数据的持久性。

但是缓冲区的脏页数据并不是实时刷新的,而是通过一段时间之后将缓冲区的数据刷新到磁盘中,如果在刷新磁盘的过程中出错了,但是提示用户事务提交成功了,最终数据并没有持久化,这就出现问题了,事务的持久性没有得到保障。

image-20220625084647646

3.3.使用redo log之后是怎样的流程

为了避免事务的持久性出现的问题,在INnoDB存储引擎中提供了一份日志redo log。

有了redo log之后,当对缓冲池中的数据进行增删改之后,会将数据页的变化记录在redo log buffer缓冲区中,当事务提交之后,会将redo log buffer中的数据刷新到redo log的磁盘文件中。

当一段时间之后要刷新缓冲区的脏页数据到磁盘时,发生了错误,此时就可以借助redo log进行的数据恢复,这样就保证了事务的持久性。

当脏页数据成功刷新到磁盘,此时redolog就没有作用了,可以被回收,所以redo log是有大小限制的,当超过限制后会循环写入,覆盖掉最早的数据。

image-20220625083845139

我们可以再思考一个问题,为什么每次提交时候之后,要刷新redo log buffer中的数据导磁盘,并不是直接将buffer pool中的脏页数据刷新到磁盘呢?其实也非常简单,因为操作数据一般都是随机读写磁盘的,并不是顺序读写磁盘,随机读写磁盘对I/O的消耗很高,而redo log在磁盘中是日志文件,所以是顺序写入的,顺序写入的效率要远高于随机写。

这种先写日志也有名词:WAL(Write-Ahead Logging)

4.Undo log的核心概念

undo log日志是回滚日志,主要记录事务提交之前的数据信息,当事务需要回滚时会从undo log日志文件中读取旧的数据内容。另外在MVCC多版本并发控制中也会用到undo log。

undo log和redo log记录物理日志不同,undo log记录的是逻辑日志,因为是用于回滚数据时使用,所以undo log会将一条delete语句在undo log中记录一条对应的insert语句,当是update语句时,则在undo log中记录一条相反的update语句,当要执行回滚操作时,就可以从undo log中读取相应的内容并进行回滚。

当事务提交后并不会立即删除undo log,这些日志还可能应用于MVCC。

undo log采用段的方式进行管理和记录,存放在rollback segment回滚段中,内部包含了1024个undo log segment。

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

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

相关文章

Python 对中文名称逐字按字母表进行排序并输出

使用场景 代码适用于需要对中文名称进行排序并规范化输出的情景,具体为处理一个包含中文姓名的文本文件,按姓名的拼音首字母进行排序,并以规范的格式输出。 排序规则: 将名称按照姓氏首字母A-Z的次序,进行排序&#x…

15+铁死亡超高分推荐,快来码思路

今天给同学们分享一篇生信文章“Polydopamine Nanoparticles Targeting Ferroptosis Mitigate Intervertebral Disc Degeneration Via Reactive Oxygen Species Depletion, Iron Ions Chelation, and GPX4 Ubiquitination Suppression”,这篇文章发表在Adv Sci (Wei…

【漏洞复现】狮子鱼任意文件上传漏洞

漏洞描述 狮子鱼CMS(Content Management System)是一种网站管理系统,旨在帮助用户更轻松地创建和管理网站。它具有用户友好的界面和丰富的功能,包括页面管理、博客、新闻、产品展示等。 狮子鱼CMS使用简单直观的管理界面,使得网站所有者可以方便地进行内容的发布、管理和…

Python插件 - 动态 简单账表 通过SQL存储过程输出列实现动态展示

第一步 新建一个简单账表加上表头标签 第二步 新建一个过滤框 第三步 修改过滤窗口标识 第四步 注册插件 python代码实现 import clr clr.AddReference("System") clr.AddReference("System.Core") clr.AddReference("Kingdee.BOS") clr.AddRe…

思腾云计算中心 | 5千平米超大空间,基础设施完善,提供裸金属GPU算力租赁业务

2021年,思腾合力全资收购包头市易慧信息科技有限公司,正式开启云计算业务。思腾云计算中心占地2400平米,位于包头市稀土高新区,毗邻多家知名企业,地理位置优越,交通便利,是区内重要的信息化产业…

数据结构实验—宿舍管理系统(C,Python,Java三种代码版本)

目录 实验课程 实验内容 数据结构类型定义 模块划分 (C语言)详细代码设计 (python)详细代码设计 (Java)详细代码设计 测试数据及结果 实验总结 实验课程 课程名称:数据结构 实验名称&…

C-11练习题

一、单项选择题(本大题共20小题,每小题2分,共40分。在每小题给出的四个备选项中选出一个正确的答案,并将所选项前的字母填写在答题纸的相应位置上。) 1,在C语言中,合法的长整型常数是() A. OxOL B. 4962710M C. 324562& D. 216D 2,设有定义: int a[10],*pa6,*q…

封装PoiExcelUtils

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 为什么要封装PoiExcelU…

Python实现FA萤火虫优化算法优化卷积神经网络回归模型(CNN回归算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法(Fire-fly algorithm,FA)由剑桥大学Yang于2009年提出 , …

基于c++版本的数据结构改-python栈和队列思维总结

##栈部分-(叠猫猫) ##抽象数据类型栈的定义:是一种遵循先入后出的逻辑的线性数据结构。 换种方式去理解这种数据结构如果我们在一摞盘子中取到下面的盘子,我们首先要把最上面的盘子依次拿走,才可以继续拿下面的盘子&…

python+django企业物流配送管理系统a3t2w

本物流管理系统采用python技术,Mysql数据库开发,充分保证了系统稳定性、完整性。 物流管理系统的设计与实现的设计思想如下: 1、操作简单方便、系统界面安全良、简单明了的页面布局、方便查询物流管理系统相关信息。 2、即时可见&#xff1…

Ubuntu18.04 本地安装CVAT标注工具

写在前面: 1、如果直接clone最新版本的cvat,python版本最好安装3.8的,因为其中部分代码的语法只有高版本的python才可以支持。 2、安装完成以后本地登陆可能出现"cannot connect to cvat server"的错误,可以从Cannot …

全面解决Error: Uncaught SyntaxError: Invalid Unicode escape sequence

是因为.js文件中的路径转义(\)错误,可能是windows内的相对路径放到linux中有问题 直接看图: (上面是修改后的,下面的则是原来的) 解决方式: 先在报错浏览器按f12打开调试,选择console窗口查看…

c++函数模板STL详解

函数模板 函数模板语法 所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。 凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数&#xf…

pre标签展示代码块

pre样式 添加背景色、边框、以及调整了字体大小。 pre { border: 1px solid #999; page-break-inside: avoid; display: block; padding: 3px 3px 2px; margin: 0 0 10px; font-size: 13px; line-height: 20px; word-break: break-all; word-wrap: break-word; /* white-space:…

​HTML代码混淆技术:原理、应用和实现方法详解

​HTML代码混淆技术:原理、应用和实现方法详解 HTML代码混淆是一种常用的反爬虫技术,它可以有效地防止爬虫对网站数据的抓取。本文将详细介绍HTML代码混淆技术的原理、应用以及实现方法,帮助大家更好地了解和运用这一技术。 一、HTML代码混淆…

C++ 指针进阶

目录 一、字符指针 二、指针数组 三、数组指针 数组指针的定义 &数组名 与 数组名 数组指针的使用 四、数组参数 一维数组传参 二维数组传参 五、指针参数 一级指针传参 二级指针传参 六、函数指针 七、函数指针数组 八、指向函数指针数组的指针 九、回调函…

stm32项目(11)——基于stm32的俄罗斯方块游戏机

1.功能设计 使用stm32f103zet6平台,以及一块LCD屏幕,实现了一个俄罗斯方块游戏机。可以用按键调整方块的位置、还可以控制方块下降的速度! 2.视频演示 俄罗斯方块 3.俄罗斯方块发展史 俄罗斯方块是一种经典的拼图游戏,由苏联俄罗…

隧道施工废水工艺设备需要哪些

隧道施工废水工艺设备是保障隧道施工过程中废水处理的关键装备。它们能够有效处理施工废水中的悬浮物、悬浮油、重金属等污染物,确保废水排放符合相关环保标准。以下是隧道施工废水工艺设备常见的几种类型: 1. 隧道施工废水沉淀池:沉淀池是废…

销售经理应该具备哪些能力?

销售经理应该具备哪些能力? 俗话说火车跑的快,全靠车头带,这句话虽然有些片面,但是也说明作为团队直接领导的销售经理担当者重要的角色,他们不仅要学会管理自我,更重要的是要管理团队,激发他人…