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

文章目录

    • 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.mzph.cn/news/201564.shtml

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

相关文章

【链表Linked List】力扣-83 删除排序链表中的重复元素

目录 题目描述 解题过程 题目描述 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 示例 1: 输入:head [1,1,2] 输出:[1,2]示例 2: 输入&#xff1…

Python源码17:使用海龟画图turtle画五星红旗

turtle模块是一个Python的标准库之一,它提供了一个基于Turtle graphics的绘图库。Turtle graphics是一种流行的绘图方式,它通过控制一个小海龟在屏幕上移动来绘制图形。 turtle模块可以让您轻松地创建和控制海龟图形,从而帮助您学习Python编…

python基于轻量级卷积神经网络模型ShuffleNetv2开发构建辣椒病虫害图像识别系统

轻量级识别模型在我们前面的博文中已经有过很多实践了,感兴趣的话可以自行移步阅读: 《移动端轻量级模型开发谁更胜一筹,efficientnet、mobilenetv2、mobilenetv3、ghostnet、mnasnet、shufflenetv2驾驶危险行为识别模型对比开发测试》 《基…

你的手机注册了多少互联网账号?赶快通过这个功能查询一下吧!

一键查询手机号绑定!你的手机注册了多少互联网账号?赶快查询一下吧! 你知道你名下的手机号绑定了多少互联网账号吗? 怎么查询手机号绑定了什么账号呢? ...... 不用担心 一键查询手机号绑定的帐号功能来了! …

制造业企业如何建立智能工厂

今天就聊聊企业智能工厂的打造,企业想实现数字化转型建立智能工厂,就需要先建设数字化车间,可以说数字化车间是建设智能工厂的重要一环,智能工厂的基础是数字化车间。数字化车间可以实现企业生产过程中车间计划调度、工艺执行管理…

食品厂ERP有哪几种?食品厂ERP软件哪个操作简单

食品安全问题是近些年备受消费者和企业关注的行业,而食品安全管理涉及原材料、配方、车间、工艺、设备、包装、仓储、保质期等多个方面,因而各个业务部门之间的协同问题就显得颇为重要。 想要提升采购、保质期、库龄分析、财务、订单、原材料、仓储等各…

Pycharm修改文件默认打开方式 + CSV Editor插件使用

1、File —> Settings —> Editor —> File Types 然后将*csv添加到最上面 在plugins中下载插件,CSV Editor 备注:不在上一步的“File Types”中将*.csv设置为CSV格式,插件是不起作用的 就可以使用了

十二、FreeRTOS之FreeRTOS任务相关API函数

本节需要掌握以下内容: 1,FreeRTOS任务相关API函数介绍(熟悉) 2,任务状态查询API函数实验(掌握) 3,任务时间统计API函数实验(掌握) 4,总结 一…

【Docker】从零开始:15.搭建亿级数据Redis集群之哈希算法概念

【Docker】从零开始:15.搭建亿级数据Redis集群之哈希算法概念篇 概述一般业界的3种解决方案1.哈希取余分区优点:缺点: 2.一致性哈希算法分区背景目的原理一致性哈希环节点映射key落到服务器的落键规则 优点容错性扩展性 缺点 3.哈希槽分区背景…

家用超声波清洗机哪个牌子好?一起来看、值得推荐超声波清洗机

家用超声波清洗机可以干嘛呢?最常见的就是来清洗眼镜。眼镜党朋友应该经常接触超声波清洗机,它常出现在眼镜店中,眼镜店老板帮顾客清洗眼镜;也会出现在工业领域、医疗领域等,超声波清洗机使用范围还是挺广的&#xff0…

微信小程序 分享的两种方式:菜单级和按钮级

按钮级 在使用微信小程序的时候,我们可能会设计到一些视频的一些分享等,那么视频分享也分为两种方式,例如下图,当我们点击的时候,进行一个转发分享的一个操作 那么在原先代码的基础上,我们需要在原先代码的基础上butt…

Unity中动态合批

文章目录 前言一、动态合批的规则1、材质相同是合批的前提,但是如果是材质实例的话,则一样无法合批。2、支持不同网格的合批3、动态合批需要网格支持的顶点条件二、我们导入一个模型并且制作一个Shader,来测试动态合批1、我们选择模型的 Mesh…

电商API接口开发和接入说明{包含淘宝/京东/拼多多/抖音}

“为什么改了这个没告诉我” “实际功能和文档上说的不一样啊”。 这些话大家在进行电商API接口开发时,想必耳朵都听出老茧了。 真不是故意的,有时候任务比较急,就先改了代码,想着以后再同步文档,然后就给忘了。 项…

在Pycharm中使用GitHub的方法步骤

文章目录 前言一、配置Pycharm二、建立远程仓库并提交代码三、在github中查看上传的新仓库四、使用pycharm克隆github仓库五、在pycharm内进行git的相关操作关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源…

【C++】三大特性 --- 继承的详细讲解

目录 1.继承的概念及定义 1.1 继承的概念 1.2 继承定义 1.2.1定义格式 1.2.2继承关系和访问限定符 1.2.3继承基类成员访问方式的变化 2.基类和派生类对象赋值转换 3.继承中的作用域 4.派生类的默认成员函数 5.继承与友元 6.继承与静态成员 7.复杂的菱形继承及菱形虚…

从0到1构建智能分布式大数据爬虫系统

文章目录 1. 写在前面2. 数据获取挑战3. 基础架构4. 爬取管理5. 数据采集6. 增量与去重设计 【作者主页】:吴秋霖 【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作! 【作者推荐…

win10的系统下实现SUSTechPOINTS环境搭建

** win10的 标题系统下实现SUSTechPOINTS环境搭建 ** 参考文档: doc/install_from_source.md 张金来/SUSTechPOINTS - Gitee.com 在win10的系统下搭建**SUSTechPOINTS环境 1 克隆代码 git clone https://github.com/naurril/SUSTechPOINTS2 安装环境 2.1 创…

【EtherCAT详解】基于Wireshark的EtherCAT帧结构解析

写在前面 EtherCAT的报文比较繁琐,且一些参考书籍错误较多,且晦涩难懂,对于初学者,很难快速的入门。本文适用于有一定基础的研究者,如对报文有一些研究、对canopen协议有一定了解、并且对TwinCAT有了解的研究者。当然,对于初学者来说,也是很好的引导,少走很多弯路。本…

css 字体添加外轮廓

color: #ffeb3b; -webkit-text-stroke: 10px transparent; background: linear-gradient(90deg,#5d3d02f5,#5d3d02f5,#5d3d02f5,#5d3d02f5,#5d3d02f5,#5d3d02f5,#5d3d02f5) top left / 100% 100%; -webkit-background-clip: text;

语义分割网络-FCN全卷积网络

全卷积神经网络FCN整体概述 FCN是首个端对端针对像素级预测的全卷积网络。FCN会用到分类网络作为backbone FCN的网络结构类比分类网络 分类网络经过卷积操作后,接全连接层,最后一个全连接层输出长度与分类类别数量相同,最后经过softmax得到术…