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

news2024/11/25 10:01:49

一、基本介绍

​ 每当我们要对一条记录做改动时(这里的改动可以指 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://www.coloradmin.cn/o/1617627.html

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

相关文章

大数据技术应用实训室解决方案

一、大数据课程体系 1.1 大数据实验实训课程体系设计依据 大数据实验实训课程体系的设计依据主要围绕培养目标、培养方案和课程体系建设三个方面来展开。 1、培养目标 大数据实验实训课程的设计旨在培养具备大数据理论知识和实践技能的专业人才。具体而言,这些人才…

刷课必备!用Python实现网上自动做题

前言 开学少不了老师会布置一些 软件上面的作业,今天教大家用python制作自动答题脚本,100%准确率哦喜欢的同学记得关注、收藏哦 环境使用 Python3.8Pycharm 模块使用 import requests —> 数据请求模块 pip install requestsimport parsel —>…

TypeError: FormatCode() got an unexpected keyword argument ‘verify‘

背景 使用mmdet3d调试项目,提示下面的错误 笔者使用的mmcv版本为mmcv-full1.4.0 原因分析 从截图中可以看出错误出现在/usr/local/lib/python3.8/dist-packages/mmcv/utils/config.py的第496行:text, _ FormatCode(text, style_configyapf_style, v…

环回光模块

👏📍环回光模块(Lookback),也称为光模块自环测试回路器,用于测试系统或网络中的信号回传。通过回传信号(主要是成对连接发射端到接收端的一侧),可以检测网络链路中各种潜…

java网络编程 BufferedReader的readLine方法读不到数据且一直阻塞

最近在整理Java IO相关内容,会遇到一些以前没有注意的问题,特此记录,以供自查和交流。 需求: 基于Java的BIO API,实现简单的客户端和服务端通信模型,客户端使用BufferedReader的readLine方法读取System.i…

​「Python绘图」绘制皮卡丘

python 绘制皮卡丘 一、预期结果 二、核心代码 import turtle print("开始绘制皮卡丘") def getPosition(x, y):turtle.setx(x)turtle.sety(y)print(x, y)class Pikachu:def __init__(self):self.t turtle.Turtle()t self.tt.pensize(3)t.speed(190)t.ondrag(getP…

隋总分享:Temu选品师算不算是蓝海项目?

在当今日新月异的互联网经济浪潮中,跨境电商正成为一股不可忽视的力量。最近,网红隋总对Temu选品师这一职业进行了深入介绍,引发了广泛关注。那么,Temu选品师是否真的可以视为一个蓝海项目呢?本文将对此进行一番细致的探讨。 首先…

python学习笔记B-08:序列结构之列表--列表的遍历操作

列表的遍历操作主要通过以下三种方法实现。 lst list("hello") print("第一种遍历方式,使用for循环,循环变量item直接就是lst中的元素") for item in lst:print(item,end"\t")print("\n\n第二种遍历方式&#xff0…

【HarmonyOS】Stage 模型 - 基本概念

一、项目结构 如图1所示: 图1 从项目结构来看,这个应用的内部包含了一个子模块叫 entry,模块是应用的基本功能单元,它里面包含源代码、资源、配置文件等。 像这样的模块在应用内部可以创建很多。但模块整体来讲就分成两大类&am…

unity中重构(分拆)输入代码

codemonkey的混乱厨房第14节,讲述了怎么来重构代码。 目的:是减少和管理的复杂性,每个类只做一件事,只能做一件事 重构思路分析: 空对象 挂着新类脚本 新类{ 公开方法 public 带返回值 } --------------------------…

【大模型开源篇1】彦宏您怎么看LLaMA3的开源

Meta LLaMA是Meta公司开源的大模型,作为大模型开源界得鼻祖, 刚刚发布LLaMA3。从ChatGPT 拉开了大模型竞赛的序幕,Meta 选择了开源,至此大模型也开始百花齐放的时期,但是开源模型一直无法超过必源模型,如今…

2024最新Notepad++ 的下载、安装及配置

Notepad是一款免费且开源的文本和源代码编辑器,支持多种编程语言。它运行在MS Windows环境下,使用GPL许可证发布。由于其轻量级和高效性,成为了许多开发者的首选工具。 下载地址:「Notedpad」, 链接:https…

报销管理如何秒变高效神器?

一、客户介绍 易快报作为业界知名的企业报销管理平台,一直致力于为企业提供高效、便捷的报销服务。随着业务的不断扩展,易快报面临着与多个外部系统进行数据交互的需求,以提升工作效率和减少数据差错。中信建投作为国内领先的金融机构&#…

GLID: Pre-training a Generalist Encoder-Decoder Vision Model

1 研究目的 现在存在的问题是: 目前,尽管自监督预训练方法(如Masked Autoencoder)在迁移学习中取得了成功,但对于不同的下游任务,仍需要附加任务特定的子架构,这些特定于任务的子架构很复杂&am…

关于C++STL的总结(基础使用和底层原理)

STL是什么? STL即(Standard Template Library)标准模板库,提供了常见的数据结构和算法函数等,其下共包含六大组件: 容器算法迭代器仿函数适配器空间配置器 本篇重点介绍容器的使用和简单的底层实现原理&…

不容忽视的听力“杀手”

音乐与短视频已成为现代生活的重要组成部分,许多人在繁忙的日常中依赖耳机来获得片刻的宁静或激情。然而,我们也需要警惕,不当的耳机使用可能对我们的听力造成风险。长时间以高音量使用耳机,无疑会对听力构成挑战。 *图片源于网络…

贪吃蛇项目实战——学习详解

前言:贪吃蛇是一个经典的游戏, 本节将使用c语言实现一个简易的的贪吃蛇小游戏。 本节内容适合已经学完c语言还有数据结构链表的友友们。 我们要实现的贪吃蛇是在控制台进行游戏的。 它运行起来是这样的: 贪吃蛇 那么, 为了实现这个小游戏。 我…

图解KMP算法——字符串搜索

原文:最初发布地址 一、问题描述 来源:Leetcode 难度:中等 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 hays…

2024年最新版云开发cms开通步骤,开始开发微信小程序前的准备工作,认真看完奥!

小程序官方有改版了,搞得石头哥不得不紧急的再新出一版,教大家开通最新版的cms网页管理后台 一,技术选型和技术点 1,小程序前端 wxml css JavaScript MINA原生小程序框架 2,数据库 云开发 云数据库 云…

SOTAX溶出测试系统PC触摸屏维修三部曲

SOTAX溶出测试系统作为一款广泛应用于制药行业的知名品牌,具有高精度、操作简便、稳定性好等特点。它适用于各种类型的药品研发和生产环节,为科研人员提供可靠的数据支持。瑞士SOTAX溶出仪是实验室中常用的设备,其触摸屏是用户交互的重要界面…