undo日志详解

news2025/5/15 6:42:06

一、undo日志介绍

上一节详细的说了redo日志,redo日志的功能就是把增删改操作都记录着,如果断电导致内存中的脏页丢失,可以根据磁盘中的redo日志文件进行恢复。redo日志被设计出来是为了保证数据库的持久性,undo日志设计出来是为了保证数据库的原子性。一个事务开启之后,做增删改操作,会记录redo日志,但是如果后悔了进行回滚,redo日志是做不到回退的,这时候就需要undo日志了。

总结:记住一句话,redo日志保证了数据库的持久性,undo日志保证了数据库的原子性。

二、undo日志格式

一般每次对记录做一次改动就会对应生成一条undo日志。有些更新语句记录的操作中,也可能会生成两条undo日志。

一个事务在执行过程中可能新增,删除,更新若干条记录,同样也会生成若干条记录,这些undo日志会从0开始编号,并且是按照顺序生成,被称为第0号undo日志,1号。。。

这些undo日志是被记录到类型为FIL_PAGE_UNDO_LOG页面。这些页面可以从系统表空间(ibdata1文件)中分配,也可以从一种专门存放undo日志的表空间,也就是undo tablespace。

insert操作对应的undo日志

前面文章说过,插入操作分为乐观插入和悲观插入。但是关于插入操作无非就是把记录放到数据页中,如果想要回滚就直接把这条记录删除就可以,也就是说在写对应的undo日志时,主要是把这条记录的主键记录,这样删除记录就可以根据主键找到二级索引和聚簇索引上的记录。InnoDB设计了一个类型为TRX_UNDO_INSERT_RECundo⽇志

属性说明:

undo no上面说过,从0开始,只要这个事务没提交,按顺序生成undo日志,依次递增。

主键的每个列占用的存储空间和真实值。为什么存储主键就可以了,上面也说了,如果想要回滚就直接把这条记录删除就可以,也就是说在写对应的undo日志时,主要是把这条记录的主键记录,这样删除记录就可以根据主键找到二级索引和聚簇索引上的记录。后面的delete和update也一样不再强调。

undo_demo 中插⼊两条记录:
BEGIN;  # 显式开启⼀个事务,假设该事务的 id 100
# 插⼊两条记录
INSERT INTO undo_demo(id, key1, col)
    VALUES (1, 'AWM' , ' 狙击枪 ' ), (2, 'M416' , ' 步枪 ' );

因为主键只包含id,所以插入的两条记录,会按照顺序生成两个undo日志,第一个undo日志:

第二个undo日志:

roll_pointer隐藏列的含义

前面的文章介绍过记录的三个隐藏列,只剩roll_pointer没有说过,他本质上就是一个指向记录对应的undo日志的一个指针,比方说上面的插入两条记录的操作,每条记录都有对应的一个undo日志。关系就是记录被存储到类型为FIL_PAGE_INDEX的页面(前面说的数据页),undo日志被放到类型为FIL_PAGE_UNDO_LOG的页面中

delete操作对应的undo日志

前面的文章详细的说过数据页中的记录会组成一个单向链表,我们把这个链表称之为正常记录链表。并且删除某条记录,被删除的记录也会形成一个链表,叫垃圾链表,并且这条垃圾链表中记录占用的存储空间可以被重新利用。

上图简化了记录,只标记了delete_mask属性,我们删除最后一条记录,删除的过程需要经历两个阶段:

阶段一:只是将该记录的delete_mask表示为设置为1,修改记录隐藏列trx_id、roll_pointer这些隐藏列的值。

在事务提交之前,删除的记录都处于这个中间状态,被删除的记录没有被加入垃圾链表(为了实现MVCC功能)。

阶段二:当删除的语句所在事务提交之后,会有专门的线程把记录加入垃圾链表中,并且调整页面的其他信息。这个阶段称为purge。

把阶段二执行完了,这条记录就算真正的删除了,这条已删除的记录占用的存储空间也可以被重新利用了。

从上图我们可以看到真正删除之后被删除的记录加入垃圾链表的头结点,修改垃圾链表PAGE_FREE属性的值。

⻚⾯的Page Header部分有⼀个PAGE_GARBAGE属性,该属性记录着当前⻚⾯中可重⽤存储空间占⽤的总字节数。每当有已删除记录被加⼊到垃圾链表后,都会把这个PAGE_GARBAGE属性的值加上该已删除记录占⽤的存储空间⼤⼩。PAGE_FREE指向垃圾链表的头节点,之后每当新插⼊记录时,⾸先判断PAGE_FREE指向的头节点代表的已删除记录占⽤的存储空间是否⾜够容纳这条新插⼊的记录,如果不可以容纳,就直接向⻚⾯中申请新的空间来存储这条记录(是的,你没看错,并不会尝试遍历整个垃圾链表,找到⼀个可以容纳新记录的节点)。如果可以容纳,那么直接重⽤这条已删除记录的存储空间,并且把PAGE_FREE指向垃圾链表中的下⼀条已删除记录。但是
这⾥有⼀个问题,如果新插⼊的那条记录占⽤的存储空间⼤⼩⼩于垃圾链表的头节点占⽤的存储空间⼤⼩,那就意味头节点对应的记录占⽤的存储空间⾥有⼀部分空间⽤不到,这部分空间就被称之为碎⽚空间。那这些碎⽚空间岂不是永远都⽤不到了么?其实也不是,这些碎⽚空间占⽤的存储空间⼤⼩会被统计到PAGE_GARBAGE属性中,这些碎⽚空间在整个⻚⾯快使⽤完前并不会被重新利⽤,不过当⻚⾯快满时,如果再插⼊⼀条记录,此时⻚⾯中并不能分配⼀条完整记录的空间,这时候会⾸先看⼀看PAGE_GARBAGE的空间和剩余可利⽤的空间加起来是不是可以容纳下这条记录,如果可以的话,InnoDB会尝试重新组织⻚内的记录,重新组织的过程就是先开辟⼀个临时⻚⾯,把⻚⾯内的记录依次插⼊⼀遍,因为依次插⼊时并不会产⽣碎⽚,之后再把临时⻚⾯的内容复制到本⻚⾯,这样就可以把那些碎⽚空间都解放出来(很显然重新组织⻚⾯内的记录⽐较耗费性能)。
不知道大家意识到没有,在删除语句所在的事务提交之前,只会经历阶段一,也就是delete mark阶段,提交之后我们就不用回滚,所以只需要考虑删除操作阶段一做的影响进行回滚。InnoDB为阶段一设计了 TRX_UNDO_DEL_MARK_REC 类型的 undo ⽇志

undo日志使用的ibp,到底有没有undo buffer?

undo日志写在磁盘的系统表空间,即数据目录的ibdata1文件中,是字扩展文件

undo日志刷入磁盘的时机,比redo日志还之前。

undo页其实在事务提交之后就没用了,就可以删除了。

参考:

https://blog.51cto.com/u_16099245/8284858?u_atoken=cb0a23c68bb36e0b51bdd6698c0d1b1e&u_asession=010oqemvtD-SI70HvdIIJ3SD6rL-0g4lqUd_UCHB5kIzJd_RzP7PK5M9OMtfYEHkSMdlmHJsN3PcAI060GRB4YZGyPlBJUEqctiaTooWaXr7I&u_asig=05KSFHoAoEbI0nFMyiGbILePlRrb4fDSnENTW1oe0zxFMc_aeYEexCgEgeGZ16H7ZE1DUDCzmL2emmn6qmFC9CC_XK8dYD1h4eorn2e4KHNprayj0S6sDcNlfu97C_4rOSwYUPHbo6E_XIjuXpGnuIY3njx0LLgd3IEivFU82Koe5g2QMxYs6lyXb1lFWKql56bKAECQJI7JT5rwB3i3DMxmVX6G2FWvrtzLd69hasdI_jtcevR-HxX_TJmPgBpiSXfv5D2tGhDz888pbf-PhVCPH6b79Mch4xN3KRAVxzONmsTpJ-4hEVCCqo-GZeD3WUZHi7af-9T9DT_5BT1SiXZw&u_aref=KA7pqKy7uBwsbhILbK67J7v6BqM%3D

MySQL 的undo什么时候写到硬盘? - 知乎

003_Mysql之事务详解redo log、undolog 和 MVCC_undolog存放在磁盘的哪里-CSDN博客

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

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

相关文章

【Java程序设计】【C00278】基于Springboot的数码论坛管理系统(有论文)

基于Springboot的数码论坛管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的数码论坛系统 本系统分为系统功能模块、管理员功能模块以及用户功能模块。 系统功能模块:在系统首页可以查看首页、…

CSS列表学习2

之前学习了列表&#xff1b;继续熟悉&#xff1b; <!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/><title></title><meta charset"utf-8" /><…

Django学习笔记-HTML实现服务器图片的下载

1.index编写代码,跳转下载页面 2.创建download界面 3.编写download路由 4.创建download函数 1).如果请求的方法是GET&#xff0c;imglist变量存储从models.imgModel模型中获取的所有对象,创建字典ctx,使用render函数来渲染download.htm 2).如果请求的方法是POST,获取要下载的文…

tinymce问题处理

Vite构建工具下Tinymce踩坑指南 解决方案是在路劲前面增加/&#xff0c;这个跟上面链接有些区别&#xff0c;区别原因应该是如果路由采用的是createWebHashHistory则应该去掉/&#xff0c;如果是createWebHistory则应该加上/ 页面引用,一种异步加载&#xff0c;一种同步加载&…

挑战杯 基于大数据的股票量化分析与股价预测系统

文章目录 0 前言1 课题背景2 实现效果3 设计原理QTChartsarma模型预测K-means聚类算法算法实现关键问题说明 4 部分核心代码5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于大数据的股票量化分析与股价预测系统 该项目较为新颖…

RK3568平台开发系列讲解(Linux系统篇)字符设备驱动:主设备和次设备

🚀返回专栏总目录 文章目录 一、主设备和次设备的概念二、设备号的分配和释放沉淀、分享、成长,让自己和他人都能有所收获!😄 字符设备通过字符(一个接一个的字符)以流方式向用户程序传递数据,就像串行端口那样。字符设备驱动通过/dev目录下的特殊文件公开设备的属性和…

涵盖5大领域的机器学习工具介绍

随着数据的产生及其使用量的不断增加&#xff0c;对机器学习模型的需求也在成倍增加。由于ML系统包含了算法和丰富的ML库&#xff0c;它有助于分析数据和做出决策。难怪机器学习的知名度越来越高&#xff0c;因为ML应用几乎主导了现代世界的每一个方面。随着企业对这项技术的探…

详细教程!VMware Workstation Pro16 安装 + 创建 win7 虚拟机!

嚯嚯嚯&#xff0c;很多宝子都想拥有自己不同的操作系统环境&#xff0c;用于学习或项目搭建。买服务器费钱&#xff0c;虚拟机则成为了一个很好的选择。本文详细介绍VMware Workstation Pro 16安装及win7虚拟机创建&#xff0c;保姆级教程奉上&#xff01; 一、准备工作 VMw…

在Sora引爆视频生成时,Meta开始用Agent自动剪视频了

未来&#xff0c;视频剪辑可能也会像视频生成领域一样迎来 AI 自动化操作的大爆发。 这几天&#xff0c;AI 视频领域异常地热闹&#xff0c;其中 OpenAI 推出的视频生成大模型 Sora 更是火出了圈。而在视频剪辑领域&#xff0c;AI 尤其是大模型赋能的 Agent 也开始大显身手。 …

【python】0、超详细介绍:json、http

文章目录 一、json二、http2.1 json 读取 request 序列化 三、基本类型3.1 decimal 四、图像4.1 颜色格式转换 一、json import json f open(data.json) # open json file data json.load(f) # 读出 json object for i in data[emp_details]: # 取出一级属性 emp_details, …

基础复习(GDB调试)

1.GDB环境配置 这里只说Pwndbg Pwndbg的安装简单&#xff0c;访问Github主页&#xff0c;https://github.com/pwndbg/pwndbg 在“How”栏中看到安装说明 2.打开文件 GDB打开文件的方式与图形化的工具不同&#xff0c;需要通过传入参数或执行命令 方式1&#xff1a;在GDB的…

Python实现DAS单点登录

❇️ 流程 进入登录页面 &#xff08;DAS验证的登录页面&#xff09; 获取验证码图像&#xff0c;百度OCR识别 登录 &#x1f3de;️ 环境 Windows 11 Python 3.12 PyCharm 2023 &#x1f9f5; 准备工作 安装必要依赖库 bs4 Jupyter 推荐安装 Jupyter&#xff08;Anaco…

WSL2配置Linux、Docker、VS Code、zsh、oh my zsh(附Docker开机自启设置)

0. 写在前面 本篇笔记来自于UP主麦兜搞IT的合集视频Windows10开发环境搭建中的部分内容 1. 安装WSL2 按照微软官方文档进行操作&#xff0c;当然也可以直接wsl --install 也可以按照 旧版手动安装的步骤 来进行操作 选择安装的是Ubuntu 20.04 LTS 注&#xff1a;WSL默认安装…

Vue + Echarts页面内存占用高问题解决

Vue Echarts页面内存占用高问题解决 1.问题描述 目前使用的是Vue2 Echarts4.x的组合&#xff0c;页面如下所示。 就是一个类似于神策的数据看板页面&#xff0c;左侧是一个导航栏&#xff0c;右侧看板页面中包含很多个报表图片&#xff0c;其中报表页面中对Echarts图表进…

Vision Mamba:使用双向状态空间模型进行高效视觉表示学习

模型效果 将DeiT和Vim模型之间的性能和效率比较&#xff0c;为了进行准确性比较&#xff0c;我们首先在IN1K分类数据集上预训练DeiT和Vim&#xff0c;然后在不同的下游密集预测任务上微调通用主干&#xff0c;即&#xff0c;语义分割、目标检测、实例分割。结果表明&#xff0c…

linux之前后端项目部署与发布

目录 前言 简介 一、安装Nginx 二、后端部署 2.1多个tomcat负载均衡 2.2 负载均衡 2.3 后端项目部署 三、前端部署 1.解压前端 2.Nginx配置文件修改 3.IP域名映射 4.重启Nginx服务 前言 上篇博主已经讲解过了单机项目的部署linux之JAVA环境配置JDK&Tomcat&a…

人人都是项目管理者,项目管理的基础入门

一、教程描述 本套教程旨在系统介绍项目管理的方法论&#xff0c;帮助大家认识、熟悉、体验、思考项目管理&#xff0c;全面掌握项目管理的流程与方法&#xff0c;快速成长为时代紧缺型的项目管理人才。本套项目管理入门教程&#xff0c;大小805.40M&#xff0c;共有13个文件。…

YOLO目标检测——电力绝缘子缺陷检测数据集【含对应voc、coco和yolo三种格式标签集】

实际项目应用&#xff1a;电力绝缘子缺陷检测数据集的应用范围涵盖了电力设备制造、供应、维护、监控等多个领域&#xff0c;对提升电力系统的安全性、可靠性和效率具有重要意义数据集说明&#xff1a;无缺和有缺陷两种标签类别。标签说明&#xff1a;使用lableimg标注软件标注…

【GO语言卵细胞级别教程】07.捕获异常和自定义错误

【GO语言卵细胞级别教程】07.捕获异常和自定义错误 &#x1f970;博主&#xff1a;GokuCode &#x1f970;微信公众号&#xff1a;【给点知识】分享小知识&#xff0c;快速成长,欢迎关注呀&#xff01;&#xff08;底部点击二维码&#xff09; &#x1f970;本项目演示代码仓库…

FL Studio 老用户免费更新FL Studio 21.2.3.4004 中文版及FL Studio 21更新日志

FL Studio 21是一款非常流行的数字音频工作站软件&#xff0c;它可以帮助音乐制作人和音乐爱好者创作出高质量的音乐作品。在FL Studio 21中&#xff0c;有许多插件可以帮助用户实现各种音乐效果&#xff0c;例如合成器、鼓机、效果器等等。 FL Studio 21.2.3.4004 加入了新的插…