MySQL系列—12.Undo log

1、概念

DML 操作导致数据变化 , 将变化前的记录写入 Undo 日志。

作用

用于记录更改前的一份 copy ,在操作出错时,可以用于回滚、撤销还原,只将数据库
逻辑地恢复到原来的样子
插入一条记录时,至少要把这条记录的主键值记下来,之后回滚的时候只需要把这个主键值对应的记录删掉就好了。(对于每个INSERT,InnoDB存储引擎会完成一个DELETE)
删除了一条记录,至少要把这条记录中的内容都记下来,这样之后回滚时再把由这些内容组成的记录插入到表中就好了。(对于每个DELETE,innoDB存储引擎会执行一个INSERT)
修改了一条记录,至少要把修改这条记录前的旧值都记录下来,这样之后回滚时再把这条记录更新为旧值就好了。(对于每个UPDATE,InnoDB存储引擎会执行一个相反的UPDATE,将修改前的行放回去)

存储位置

undo 存储在回滚段 ( Rollback Segment) ,每个回滚段记录了 1024 undo log segment

参数

innodb_undo_directory
设置 rollback segment文件所在的路径。这意味着 rollback segment可以存放在共享表空间以外的位置,即可以设置为 独立表空间。该参数的默认值为“./"”,表示当前InnoDB存储引擎的目录。
innodb_undo_tablespaces
设置构成 rollback segment文件的数量,设置该参数后,会在路径 innodb_undo_directory看到 undo为前缀的文件,该文件就代表 rollback segment文件。

回滚段与事务

    每一个事务只会使用一个回滚段,一个回滚段在同一个时刻可能会服务于多个事务。
    当一个事务开始的时候,会制定一个回滚段,在事务进行的过程中,当数据被修改时,原始的数据会被复制到回滚段。
    在回滚段中,事务会不断填充盘区,直到事务结束或所有的空间被用完。如果当前的盘区不够用,事务会在段中请求扩展下一个盘区,如果所有已分配的盘区都被用完,事务会覆盖最初的盘区或者在回滚段允许的情况下扩展新的盘区来使用。
    回滚段存在于undo表空间中,在数据库中可以存在多个undo表空间,但同一时刻只能使用一个undo表空间。

purge线程作用
( 1 ) 清理 undo 页和清除 page 里面带有 Delete_Bit 标识的数据行
( 2 )InnoDB 中,事务中的 Delete 操作实际上并不是真正的删除掉数据行,而是一种 Delete Mar
k 操作,在记录上标识 Delete_Bit ,而不删除记录。是一种 " 假删除 ", 只是做了个标记,真正的
删除工作需要后台 purge 线程去完成。

回滚段中的数据分类

    未提交的回滚数据(uncommitted undo information):该数据所关联的事务并未提交,用于实现读一致性,所以该事务不能被其他事务的数据所覆盖。
    已经提交但未过期的回滚数据(committed undo information) :该数据关联的事务已经提交,但是仍然受到undo retention参数的保持时间的影响。
    事务已经提交并过期的数据(expired undo information) :事务已经提交,而且数据保存时间已经超过undo retention参数指定的时间,属于已经过期的数据。当回滚段满了之后,会优先覆盖"事务已经提交并过期的数据"。

事务提交后并不能马上删除undo log及undo log所在的页。这是因为可能还有其他事务需要通过undo log来得到行记录之前的版本。故事务提交时将undo log放入一个链表中,是否可以最终删除undo log及undo log所在页由purge线程来判断。

undo的类型

insert undo log是指在insert操作中产生的undo log。因为insert操作的记录,只对事务本身可见,对其他事务不可见(这是事务隔离性的要求),故该undo log可以在事务提交后直接删除。不需要进行purge操作。

update undo log记录的是对delete和update操作产生的undo log。该undo log可能需要提供MVCC机制,因此不能在事务提交时就进行删除。提交时放入undo log链表,等待purge线程进行最后的删除。

详细生成过程

对于InnoDB引擎来说,每个行记录除了记录本身的数据之外,还有几个隐藏的列:

    DB_ROW_ID:如果没有为表显式的定义主键,并且表中也没有定义唯一索引,那么InnoDB会自动为表添加一个row_id的隐藏列作为主键。(之前索引的创建过程中讲过)
    DB_TRX_ID:每一个事务都会分配一个事务ID,当对某条记录发生变更时,就会将这个事务的事务ID写入trx_id中。
    DB_ROLL_PTR:回滚指针,本质上就是undo log的指针。

当我们执行INSERT时:
begin;
INSERT INTO user (name) VALUES ("tom");

插入的数据都会生成一条insert undo log,并且数据的回滚指针会指向它。undo log会记录undo log的序号、插入主键的列和值…,那么在进行rollback的时候,通过主键直接把对应的数据删除即可。

当我们执行update时:

对于更新的操作会产生update undo log,并且会分更新主键和不更新主键的,假设现在执行:

UPDATE user SET name="Sun" WHERE id=1;

这时会把老的记录写入新的undo log,让回滚指针指向新的undo log,它的undo no是1,并且新的undo log会指向老的undo log (undo no=0)。

假设现在执行:

UPDATE user SET id=2 WHERE id=1;

这下面是把id=1的记录,改为id=2。这里并不是简单的将id为1改为2,而是先将id=1的那个记录删除掉,然后再生成一条记录id=2

对于更新主键的操作,会先把原来的数据deletemark标识打开,这时并没有真正的删除数据,真正的删除会交给清理线程去判断,然后在后面插入一条新的数据,新的数据也会产生undo log,并且undo log的序号会递增。

可以发现每次对数据的变更都会产生一个undo log,当一条记录被变更多次时,那么就会产生多条undo log,undo log记录的是变更前的日志,并且每个undo log的序号是递增的,那么当要回滚的时候,按照序号依次向前推,就可以找到我们的原始数据了。

undo log是如何回滚的

以上面的例子来说,假设执行rollback,那么对应的流程应该是这样:

    通过undo no=3的日志把id=2的数据删除
    通过undo no=2的日志把id=1的数据的deletemark还原成0
    通过undo no=1的日志把id=1的数据的name还原成Tom
    通过undo no=0的日志把id=1的数据删除

2、redo & undo

下面是redo log + undo log的简化过程,便于理解两种日志的过程:

假设有 A B 两个数据,值分别为 1 , 2.
1. 事务开始 ; begin
2. 记录 A = 1 undo log
3. 修改 A = 3
4. 记录 A = 3 redo log
5. 记录 B = 2 undo log
6. 修改 B = 4
7. 记录 B = 4 redo log
8. redo log buffer 写入磁盘 redo log
9. 事务提交

3、CR流程

1. 什么时候会进行 Crash Recovery?
- 实例崩溃之后重启
- innodb_fast_shutdown为1 值关闭实例后重新启动
2. 检测实例是不是干净地关闭的
- 打开 Redo Logs 和系统表空间文件 (ibdataN)
- 读取并从中找到最大的 Checkpoint LSN
- 从最近的 Checkpoint 开始往后扫描 Redo Log
- 如果能够找到 Redo Log 记录,说明还有数据页的更改没有刷新到数据文件上,启动 Crash Re
covery
3.损坏页修复
- 检查双写缓冲区中的所有 128 个页
- 如果页头和页尾的 LSN 不匹配或页面校验和无效,则使用双写缓冲区中的页进行还原
- 如果该页在双写缓冲区中的版本也被破坏,则 server crash
4.前滚 Redo ,提交未提交事务
- 从最近的 Checkpoint 往后扫描到的 Redo Log 记录将被应用到各个数据文件中
- 使用 Undo Log 回滚未提交的 'ACTIVE' 状态的事务         
- 处于 PREPARE 状态的事务,如果打开了 binlog 且在 binlog 有找到对应事务的日志则重新提
交,否则回滚

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

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

相关文章

Linux系统之head命令的基本使用

Linux系统之head命令的基本使用 一、head命令介绍二、head命令的使用帮助2.1 head命令的help帮助信息2.2 head命令的语法解释 三、head的基本使用3.1 直接使用3.2 查看文件前N行3.3 查看多个文件3.4 查询文件的前5行3.5 显示文本所有内容(除了后5行内容)…

Scrapy爬虫IP代理池:提升爬取效率与稳定性

在互联网时代,数据就是新的黄金。无论是企业还是个人,数据的获取和分析能力都显得尤为重要。而在众多数据获取手段中,使用爬虫技术无疑是一种高效且广泛应用的方法。然而,爬虫在实际操作中常常会遇到IP被封禁的问题。为了解决这个…

vulnhub(4):NullByte(hydra爆破、sql注入、path劫持提权、提权小tps)

端口 nmap主机发现 nmap -sn 192.168.236.0/24 ​ Nmap scan report for 192.168.236.177 Host is up (0.00020s latency). ​ 177是新出现的机器,他就是靶机 nmap端口扫描 nmap -Pn 192.168.236.177 --min-rate 10000 -oA nmap/scan 扫描开放端口保存到 nmap/scan…

编制数据分析报表的关键步骤,这篇文章为你详细解析

在当今数据驱动的时代,数据分析报表成为了企业决策中不可或缺的工具。它不仅可以帮助我们清晰地展现数据,还能揭示数据背后的趋势与问题,为管理者提供有力的支持。那么,如何编制一份高效、准确的数据分析报表呢?本文将…

运行容器应用

kubernetes通过各种controller来管理pod的生命周期,为了满足不同的业务场景,kubernetes开发了Deployment,ReplicaSet,DaemonSet,StatefulSet,Job等多种ControllerDeployment: kubectl run nginx…

TypeScript入门 (二)控制语句

引言 大家好,我是GISer Liu😁,一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年9月学习赛的TypeScript学习总结文档。本文主要讲解TypeScript中控制语句的部分;希望通过我的知识点总结,能够帮助你更好地…

STM32MP157/linux驱动学习记录(二)

38.Linux INPUT 子系统实验 按键、鼠标、键盘、触摸屏等都属于输入(input)设备,Linux 内核为此专门做了一个叫做 input子系统的框架来处理输入事件。输入设备本质上还是字符设备,只是在此基础上套上了 input 框架,用户只需要负责上报输入事件…

Sapiens——人类视觉大模型的基础

引言 大规模预训练以及随后针对特定任务的语言建模微调取得了显著成功,已将这种方法确立为标准做法。同样, 计算机视觉方法正逐步采用大规模数据进行预训练。LAION5B、Instagram-3.5B、JFT-300M、LVD142M、Visual Genome 和 YFCC100M 等大型数据集的出现…

管道缺陷检测系统源码分享

管道缺陷检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

【2024】前端学习笔记7-颜色-位置-字体设置

学习笔记 1.定义:css2.颜色:color3.字体相关属性:font3.1.字体大小:font-size3.2.字体风格:font - style3.3.字体粗细:font - weight3.4.字体族:font - family 4.位置:text-align 1.…

Springboot与minio:

一、介绍 Minio是一个简单易用的云存储服务,它让你可以轻松地把文件上传到互联网上,这样无论你在哪里,只要有网络,就能访问或分享这些文件。如果你想要从这个仓库里取出一张图片或一段视频,让网站的访客能看到或者下载…

火狐浏览器同源策略禁止解决方案

Firefox火狐浏览器控制台,提示:已拦截跨源请求:同源策略禁止读取位于 http://127.0.0.1:5000/test.zip 的远程资源。(原因:CORS 头缺少 Access-Control-Allow-Origin)。状态码:200。 前言全局说明 Firefox火狐浏览器控…

图片文字翻译怎么快速翻译?5个软件教你快速进行图片文字翻译

图片文字翻译怎么快速翻译?5个软件教你快速进行图片文字翻译 图片文字翻译是日常工作和生活中常见的需求,尤其是在处理外文资料或旅游时。以下5款优秀的软件可以帮助你轻松、快速地将图片中的文字进行翻译,让你不再依赖手动输入和繁琐操作。…

Python燃烧废气排放推断算法模型

🎯要点 宏观能耗场景模型参数化输入数据,分析可视化输出结果,使用场景时间序列数据模型及定量和定性指标使用线图和箱线图、饼图、散点图、堆积条形图、桑基图等可视化模型输出结果根据气体排放过程得出其时间序列关系,使用推断模…

镀金引线---

一、沉金和镀金 沉金和镀金都是常见的PCB金手指处理方式,它们各有优劣势,选择哪种方式取决于具体的应用需求和预算。 沉金(ENIG)是一种常用的金手指处理方式,它通过在金手指表面沉积一层金层来提高接触性能和耐腐蚀性…

链条缺陷检测系统源码分享

链条缺陷检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

Java-数据结构-优先级队列(堆)-(一) (;´д`)ゞ

文本目录: ❄️一、优先级队列: ➷ 1、概念: ❄️二、优先级队列的模拟实现: ➷ 1、堆的概念: ➷ 2、堆的性质: ➷ 3、堆的创建: ▶ 向下调整: ➷ 4、堆的插入和删除: …

Linux权限管理: 文件访问者分类、文件类型和访问权限、权限值的表示方法、文件访问权限的相关设置方法、umask、目录的权限、粘滞位等的介绍

文章目录 前言一、文件访问者分类二、文件类型和访问权限1. 文件类型2. 基本权限 三、权限值的表示方法1. 字符表示方法2. 8进制数值表示方法 四、文件访问权限的相关设置方法1. chmod2. chown3. chgrp 五、 umask六、目录的权限七、粘滞位总结 前言 Linux权限管理&#xff1a…

论文不会写?分享6款AI论文写作免费一键生成网站!

在当今学术研究和写作领域,AI论文写作工具的出现极大地提高了写作效率和质量。这些工具不仅能够帮助研究人员快速生成论文草稿,还能进行内容优化、查重和排版等操作。本文将分享6款免费一键生成AI论文写作网站,并重点推荐千笔-AIPassPaper。 …

鸿蒙OpenHarmony【轻量系统芯片移植】物联网解决方案之芯海cst85芯片移植案例

物联网解决方案之芯海cst85芯片移植案例 本文介绍基于芯海cst85芯片的cst85_wblink开发板移植OpenHarmony LiteOS-M轻量系统的移植案例。开发了Wi-Fi连接样例和XTS测试样例,同时实现了wifi_lite, lwip, startup, utils, xts, hdf等部件基于OpenHarmony LiteOS-M内核…