【MySQL 数据宝典】【磁盘结构】- 005 Undo log 撤销日志

一、基本介绍

​ 每当我们要对一条记录做改动时(这里的改动可以指 INSERT 、 DELETE 、 UPDATE ),都需要留一手 -> 把回滚时所需的东西都给记下来

​ 你插入一条记录时,至少要把这条记录的主键值记下来,之后回滚的时候只需要把这个主键值对应的记录删掉就好了。

​ 你删除了一条记录,至少要把这条记录中的内容都记下来,这样之后回滚时再把由这些内容组成的记录插入到表中就好了。

​ 你修改了一条记录,至少要把修改这条记录前的旧值都记录下来,这样之后回滚时再把这条记录更新为旧值 就好了。

​ 我们说过 事务 需要保证 原子性 ,也就是事务中的操作要么全部完成,要么什么也不做。但是偏偏有时候事务执 行到一半会出现一些情况,比如:

  • 情况一:事务执行过程中可能遇到各种错误,比如服务器本身的错误,操作系统错误,甚至是突然断电导致 的错误。
  • 情况二:程序员可以在事务执行过程中手动输入 ROLLBACK 语句结束当前的事务的执行

这两种情况都会导致事务执行到一半就结束,但是事务执行过程中可能已经修改了很多东西,为了保证事务的原 子性,我们需要把东西改回原先的样子,这个过程就称之为 回滚 (英文名: rollback ),这样就可以造成一个 假象:这个事务看起来什么都没做,所以符合 原子性 要求。

undo log是一种用于撤销回退的日志,在数据库事务开始之前,MySQL会先记录更新前的数据到 undo log日志文件里面,当事务回滚时或者数据库崩溃时,可以利用 undo log来进行回退。

  • 产生: 事务开始前产生,事务提交时不会立刻删除 undo log ,innodb 会把事务对应的 undo log 放入到删除列表中,后面会通过现场 purge thread 进行回收处理。

注意: undo log 也会产生 redo log ,因为 undo log 也需要持久性保护。

1.1 作用总结

  1. 提供回滚操作
    • Undo Log实现了事务的原子性。在数据修改时,除了记录redo log外,还记录了相应的undo log。如果事务执行失败,可以利用undo log进行回滚。
    • Undo Log是逻辑日志,记录了数据修改的逻辑操作,如delete操作对应的是insert操作,update操作对应相反的update操作
  2. 提供多版本控制(MVCC)
    • MVCC通过Undo Log实现。当某行数据被其他事务锁定时,可以从undo log中获取该行记录之前的数据版本,从而实现了快照读。
    • 快照读:读取历史版本的数据,不需要加锁,适用于普通SELECT操作。
    • 当前读:读取最新版本的数据,适用于执行修改语句或者特定的SELECT语句。
      • select … lock in share mode、select … for update

二、工作原理

在更新数据之前,MySQL会提前生成undo log日志,并且在事务提交之前不会立即删除undo log,以确保事务执行失败时可以进行回滚操作。而undo log日志的删除是通过后台的purge线程进行回收处理的。
29.jpg
事务A执行update更新操作时,会按照以下步骤进行:

  1. 将旧版本数据备份到对应的undo buffer中。
  2. 将undo buffer中的数据持久化到磁盘中的undo log文件中。
  3. 执行update操作,将新的数据持久化到磁盘。

在事务A执行的过程中,如果事务B对数据进行了查询,根据MySQL的MVCC机制,事务B会读取到数据的快照版本,即事务A更新之前的版本。这样可以保证事务B读取到的是一致的数据视图,即使事务A正在更新数据。

2.1 存储机制

为了保证事务并发操作时,在写各自的undo log时不产生冲突,InnoDB采用回滚段的方式来维护undo log的并发写入和持久化。
回滚段概述

  • InnoDB使用回滚段来维护并发事务的Undo Log写入和持久化。
  • 每个回滚段包含多个Undo Log Segment,是管理Undo Log的基本单位。
  • 回滚段数量:InnoDB拥有128个回滚段。
  • 每个回滚段中Undo Log Segment数量:每个回滚段包含1024个Undo Log Segment。
  • 支持的Undo操作数量:因此,InnoDB支持128 * 1024个Undo操作。

并发事务执行限制

  • 最多支持的并发事务数量:由Undo Log Segment数量决定,即128 * 1024。
  • 最大支持事务并发数计算:每个事务对应一个Undo Log,最多支持131072个并发事务执行。

事务示例

START TRANSACTION; -- 开启事务A-- 执行更新操作
UPDATE table_name SET column_name = value WHERE condition;COMMIT; -- 提交事务A-- 开启另一个事务B
START TRANSACTION;-- 执行查询操作
SELECT * FROM table_name WHERE condition;COMMIT; -- 提交事务B

2.2 undo Log 的存储

事务 ID

事务执行过程中在对某个表执行增、删、改操作时,InnoDB就会给这个事务分配一个唯一的事务ID。
可以通过 information_schema.INNODB_TRX 来查询当前系统中运行的事务信息.

START TRANSACTION;select * from test1.a1;
commit;
--trx_id 就是事务ID,InnoDB 在内存维护了一个全局变量来表示事务ID,每当要分配一个事务ID时,就获取这个变量值,然后把这个变量自增1
select trx_id , trx_state ,trx_started,trx_isolation_level
from information_schema.INNODB_TRX;

行记录的隐藏列

InnoDB引擎管理的数据表中每行行记录,都存在着三个隐藏列
image.png

  • DB_ROW_ID : 如果没有为表显式的定义主键,并且表中也没有定义唯一索引,那么InnoDB会自动为表添加一个row_id的隐藏列作为主键。
  • DB_TRX_ID : 事务中对某条记录做增删改时,就会将这个事务的事务ID写入到trx_id中.
  • DB_ROLL_PTR: 回滚指针,指向undo log的指针

Insert 语句的 Undo Log 回滚日志结构

插入一条数据对应的undo操作其实就是根据主键删除这条数据就行了。
所以 insert 对应的 undo log 主要是把这条记录的主键记录上
image.png

  • start、end:指向记录开始和结束的位置。
  • 主键列信息:记录INSERT这行数据的主键ID信息,或者唯一列信息。
  • table id:表空间ID。
  • undo no:在当前事务中 undo log 的编号,从0开始。
  • undo type:undo log 的类型,insert语句的undo log类型是 TRX_UNDO_INSERT_REC

undo 回滚链

通过一个事物操作,我们一起来看一下回滚链的形成
image.png

三、相关参数

MySQL 与undo相关的参数设置:

mysql> show variables like '%undo%';
+--------------------------+------------+
| Variable_name            | Value      |
+--------------------------+------------+
| innodb_max_undo_log_size | 1073741824 |
| innodb_undo_directory    | ./         |
| innodb_undo_log_truncate | OFF        |
| innodb_undo_logs         | 128        |
| innodb_undo_tablespaces  | 0          |
+--------------------------+------------+mysql> show global variables like '%truncate%';
+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| innodb_purge_rseg_truncate_frequency | 128   |
| innodb_undo_log_truncate             | OFF   |
+--------------------------------------+-------+
  • innodb_max_undo_log_size
    • 表示每一个undolog对应的日志文件的最大值,默认最大值为1GB大小,默认初始化大小为10MB。
    • 日志文件达到该阈值之后,且参数 innodb_undo_log_truncate=ON,才会触发truncate回收(收缩)动作,被truncate后的表空间文件大小缩小到undolog表空间数据文件默认的1OMB大小。否则即便是到达最大值之后,也不会自动回收undolog的表空间。
  • innodb_undo_directory
    • 指定undo log日志的存储目录,默认值为 ./。
  • **innodb_undo_logs **
    • 在MySQL5.6版本之后,可以通过此参数自定义多少个rollback segment,默认值为128。
  • innodb_undo_tablespaces
    • 设置undo独立表空间个数,范围为0-128, 默认为0,0表示表示不开启独立undo表空间 且 undo日志存储在ibdata文件中。
    • 什么时候需要来设置这个参数 ?
      • 当DB写压力较大时,可以设置独立undo表空间,把undo从 ibdata文件中分离开来,指定 innodb_undo_directory 目录存放,可以制定到高速磁盘上,加快undo log 的读写性能。
  • innodb_undo_log_truncate
    表示是否开启自动收缩undolog的表空间的操作。如果配置为ON,并且配置了2个或2个以上的undolog表空间数据文件,当某一个日志文件大小超过设置的最大值之后,就会自动的收缩表空间数据文件。

在回收表空间数据文件的时候,被回收的表空间数据文件会临时下线,为了保证undolog一直有地方可以写,此时要保证至少还有1个undolog日志文件是在线的。这就是要求innodb_undo_tablespaces>=2的根本原因

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

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

相关文章

用于便携可穿戴设备的RX8130CE

用于便携可穿戴设备的时钟芯片模块:RX8130CE。时钟芯片模块RX8130CE,其特点是3225小尺寸和电池控制,可应用于可穿戴设备RX8130CE具有自动电源切换功能,可监视电源电压,并通过自动操作切换到备用电源,备用电源的开关电压…

PPT设置日期随改动而更新

点击插入——点击日期和时间 弹出的新窗口中勾选自动更新日期和时间

电脑上怎么调照片尺寸?这几个方法方便又好用

平时我们在制作幻灯片演示时,调整图片的大小可以确保图片适应幻灯片的布局,并提供清晰的展示效果,单张处理起来的话就比较浪费时间,但是通常我们需要批量去修改图片尺寸大小,这就需要用到比较专业的图片处理工具了&…

40-50W 1.5KVDC 隔离 宽电压输入 DC/DC 电源模块 ——TP40(50)DC 系列

TP40(50)DC系列电源模块额定输出功率为40-50W、应用于2:1、4:1电压输入范围 9V-18V、18V-36V、36V-75V、9V-36V、18V-75V的输入电压环境,输出电压精度可达1%,可广泛应用于通信、铁路、自动化以及仪器仪表等行业。

视频不够清晰怎么办?教你几种有效方法

在我们日常生活中,有时候我们会遇到不清晰的视频,这给我们带来了很多不便。那么,怎么将不清晰的视频变清晰呢?本文将为您介绍一些常用的软件工具,帮助您提升视频的清晰度。 方法一:使用AI技术 AI技术可以通…

Python写个二维码

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、进入官网下载二、下载一下三.输入代码 前言 提示:以下是本篇文章正文内容,下面案例可供参考 一、进入官网下载 官网 pip insta…

【C++庖丁解牛】C++11---右值引用和移动语义

🍁你好,我是 RO-BERRY 📗 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 目录 1 左值引用和右值引用2 左…

牛客NC179 长度为 K 的重复字符子串【simple 哈希,滑动窗口 C++、Java、Go、PHP】

题目 题目链接: https://www.nowcoder.com/practice/eced9a8a4b6c42b79c95ae5625e1d5fd 思路 哈希统计每个字符出现的次数。没在窗口内的字符要删除参考答案C class Solution {public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改&#xff0c…

Day08-Java进阶-递归异常及其处理自定义异常

1. 递归 package com.itheima.recursion;public class RecursionDemo3 {/*不死神兔(斐波那契额数列)*/public static void main(String[] args) {int sum getSum(20);System.out.println(sum);}public static int getSum(int n) {if (n 1 || n 2) {return 1;} else {return …

【nginx】nginx启动显示80端口占用问题的解决方案

目录 🌅1. 问题描述 🌊2. 解决方案 🌅1. 问题描述 在启动nginx服务的时候显示内容如下: sudo systemctl status nginx 问题出现原因: 根据日志显示,Nginx 服务启动失败,主要原因是无法绑定…

day1c++基础

const char*p;//值不可以改变,地址可以改变 const (char*)p; //值不可以改变,地址可以改变 char* const p; //值可以改变,地址不可以改变 const char* const p; //值不可以改变,地址不可以改变 char co…

【C++】封装、继承和多态

引言 在现代软件开发中,面向对象编程(Object Oriented Programming)已经成为一种广泛应用的编程范式。C作为一种支持面向对象编程的语言,在封装、继承和多态方面提供了强大的特性。本文将介绍C中的封装、继承和多态概念&#xff…

element plus:tree拖动节点交换位置和改变层级

图层list里有各种组件,用element plus的tree来渲染,可以把图片等组件到面板里,面板是容器,非容器组件,比如图片、文本等,就不能让其他组件拖进来。 主要在于allow-drop属性的回调函数编写,要理清…

数字逻辑电路基础-有限状态机

文章目录 一、有限状态机基本结构二、verilog写一个基础有限状态机(moore型状态机)三、完整代码一、有限状态机基本结构 本文主要介绍使用verilog编写有限状态机FSM(finite state machine),它主要由三部分组成,下一状态逻辑电路,当前状态时序逻辑电路和输出逻辑电路。 有…

ZYNQ之嵌入式开发04——自定义IP核实现呼吸灯、固化程序

文章目录 自定义IP核——呼吸灯实验固化程序 自定义IP核——呼吸灯实验 Xilinx官方提供了很多IP核,在Vivado的IP Catalog中可以查看这些IP核,在构建自己复杂的系统时,只使用Xilinx官方的免费IP核一般满足不了设计的要求,因此很多…

NOIP,CSP-J,CSP-S——高精度加减乘除

一、高精度加法 1、大整数的输入 int的范围,正负上下限大约为2.1*10^9; long long的范围,正负上下限大约为9.2*10^18; 如果整数成千上万位,那么这么大的整数我们如何处理? 方法:先用字符串输入,然后把每一个字符转换成为数字,存到一个int数组里 int数组中的一个位…

揭秘Faiss:大规模相似性搜索与聚类的技术神器深度解析!

Faiss(由Facebook AI Research开发)是一个用于高效相似性搜索和密集向量聚类的库。它用C编写,并提供Python绑定,旨在帮助研究人员和工程师在大规模数据集上进行快速的相似性搜索和聚类操作。 一、介绍: Faiss的核心功…

OSPF认证方式,ISIS简介,ISIS路由器类型

OSPF:转发,泛洪,丢弃

ROS 2边学边练(33)-- 写一个静态广播(C++)

前言 通过这一篇我们将了解并学习到如何广播静态坐标变换到tf2(由tf2来转换这些坐标系)。 发布静态变换对于定义机器人底座与其传感器或非移动部件之间的关系非常有用。例如,在以激光扫描仪中心的坐标系中推理激光扫描测量数据是最简单的。 这…

C++学习进阶版(一):用C++写简单的状态机实现

目录 一、基础知识 1、状态机 2、四大要素 3、描述方式 4、设计步骤 5、实现过程中需注意 (1) 状态定义 (2) 状态转换规则 (3) 输入处理 (4) 状态机的封装 (5…