MySQL系列—12.Undo log

news2024/9/21 2:47:16

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.coloradmin.cn/o/2144931.html

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

相关文章

上汽集团社招入职SHL测评:语言理解及数字推理高分攻略、真题题库

上汽集团社招待遇 上汽集团作为国内领先的汽车制造企业,其社招待遇和面试问题一直是求职者关注的焦点。以下是根据最新信息整理的上汽集团社招待遇及面试问题概览: 工资待遇:上汽集团的工资待遇在国内汽车行业中属于较高水平。根据不同职位和…

【C++二叉树】236.二叉树的最近公共祖先

236. 二叉树的最近公共祖先 - 力扣(LeetCode) 思路分析: 公共祖先满足的特征: p是q的孩子,则q是祖先,反之亦然。p和q是“我”的左子树和右子树中的节点,则“我”是祖先。(如题目中给…

物联网——USART协议

接口 串口通信 硬件电路 电平标准 串口参数、时序 USART USART主要框图 TXE: 判断发送寄存器是否为空 RXNE: 判断接收寄存器是否非空 RTS为输出信号,用于表示MCU串口是否准备好接收数据,若输出信号为低电平,则说明MCU串口可以接收数据&#…

springboot实训学习笔记(5)(用户登录接口的主逻辑)

接着上篇博客学习。上篇博客是已经基本完成用户模块的注册接口的开发以及注册时的参数合法性校验。具体往回看了解的链接如下。 springboot实训学习笔记(4)(Spring Validation参数校验框架、全局异常处理器)-CSDN博客文章浏览阅读576次,点赞7…

NANO 9K玩转RISCV之ARDUINO开发环境

一、前言 在从0-1探索RISCV指令集的路上,我们用百元不到的NANO 9K开发板一步步的实现:  1)最小的内核架构 2)取值,译码和执行的过程(电路实现ISA指令集) &#xff1…

使用神经网络拟合6项参数

使用神经网络拟合6项参数 1. 数据预处理1.1 添加参数解析1.2 数据预处理逻辑1.3 数据归一化及划分1.4 数据标签处理逻辑1.5 数据转torch 2. 定义model2.1 CNN_LSTM2.2 Transformer 3. 定义train脚本3.1 loss和optimizer3.2 train3.3 predict 1. 数据预处理 1.1 添加参数解析 …

Vue+nodejs+express汽车配件商城销售管理系统 i9cgz

目录 技术栈具体实现截图系统设计思路技术可行性nodejs类核心代码部分展示可行性论证研究方法解决的思路Express框架介绍源码获取/联系我 技术栈 该系统将采用B/S结构模式,开发软件有很多种可以用,本次开发用到的软件是vscode,用到的数据库是…

动态分析基础

实验一 Lab03-01.exe文件中发现的恶意代码 问题: 1.找出这个恶意代码的导入函数与字符串列表? 2.这个恶意代码在主机上的感染迹象特征是什么? 3.这个恶意代码是否存在一些有用的网络特征码?如果存在,它们是什么? 解答: 1.找出这个恶意代…

上调铁矿石产量预期后,淡水河谷股价能否重振?

猛兽财经的核心观点: (1)尽管市场面临挑战,但淡水河谷(VALE)还是上调了2024年的铁矿石产量预期。 (2)第二季度业绩喜忧参半;收入减少,但铁矿石出货量却很强劲。 (3)投资者…

【渗透测试】-vulnhub源码框架漏洞-Os-hackNos-1

vulnhub源码框架漏洞中的CVE-2018-7600-Drupal 7.57 文章目录  前言 1.靶场搭建: 2.信息搜集: 主机探测: 端口扫描: 目录扫描: 3.分析: 4.步骤: 1.下载CVE-2018-7600的exp 2.执行exp: 3.写入木…

QCustomPlot笔记(一)

文章目录 简介将帮助文档添加到Qt Creator中编译共享库cmake工程编译提示ui_mainwindow.h找不到qcustomplot.h文件 环境:windowsQt Creator 10.0.1cmake 简介 QT中用于绘制曲线的第三方工具 下载地址:https://www.qcustomplot.com/index.php/download 第一个压缩…

心觉:不能成事的根本原因

很多人一直都很努力,每天都很忙 每天都学习很多东西,学习各种道,各种方法论 但是许多年过去了依然一事无成 自己的目标没有达成,梦想没有实现 为什么呢 关键是没有开悟 那么什么是开悟呢 现在很多人都在讲开悟 貌似开悟很…

Docker Registry API best practice 【Docker Registry API 最佳实践】

文章目录 1. 安装 docker2. 配置 docker4. 配置域名解析5. 部署 registry6. Registry API 管理7. 批量清理镜像8. 其他 👋 这篇文章内容:实现shell 脚本批量清理docker registry的镜像。 🔔:你可以在这里阅读:https:/…

《深度学习》—— PyTorch的神经网络模块中常用的损失函数

文章目录 前言一、回归模型中常用的损失函数1、平均绝对误差损失(L1Loss)2、均方误差损失(MSELoss也称L2Loss)3、SmoothL1Loss 二、分类模型中常用的损失函数1、负对数似然损失(NLLLoss)2、二元交叉熵损失&…

XML映射器-动态sql

01-动态sql 1.实现动态条件SQL 第一种方法在sql语句中加入where 11其他条件都加and就行,这样就可以根据if条件来判断要传递的参数可以有几个 第二种方法用where标签给if语句包起来 where标签的作用如下图 第三种方法用trim标签解释如下图 用choose也可以实现条件查询如下图,…

【数据结构与算法 | 灵神题单 | 自底向上DFS篇】力扣508, 1026, 951

1. 力扣508:出现次数最多的子树元素和 1.1 题目: 给你一个二叉树的根结点 root ,请返回出现次数最多的子树元素和。如果有多个元素出现的次数相同,返回所有出现次数最多的子树元素和(不限顺序)。 一个结…

在Ubuntu中编译含有JSON的文件出现报错

在ubuntu中进行JSON相关学习的时候,我发现了一些小问题,决定与大家进行分享,减少踩坑时候出现不必要的时间耗费 截取部分含有JSON部分的代码进行展示 char *str "{ \"title\":\"JSON Example\", \"author\&…

Web植物管理系统-下位机部分

本节主要展示上位机部分,采用BSP编程,不附带BSP中各个头文件的说明,仅仅是对main逻辑进行解释 main.c 上下位机通信 通过串口通信,有两位数据验证头(verify数组中保存对应的数据头 0xAA55) 通信格式 上位发送11字节…

保护您的企业免受网络犯罪分子侵害的四个技巧

在这个日益数字化的时代,小型企业越来越容易受到网络犯罪的威胁。网络犯罪分子不断调整策略,并使用人工智能来推动攻击。随着技术的进步,您的敏感数据面临的风险也在增加。 风险的不断增大意味着,做好基本工作比以往任何时候都更…

Java--stream流、方法引用

Stream流 - Stream流的好处 - 直接阅读代码的字面意思即可完美展示无关逻辑方式的语义 - Stream流把真正的函数式编程风格引入到Java中 - 代码简洁 - Stream流的三类方法 - 获取Stream流 - 创建一条流水线,并把数据放到流水线上准备进行操作 - 中间方法 - 流水线上的操作 - 一次…