初识 undo log

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 初识 undo log


undo log 回滚原理



前面介绍了 redo log,有了它便可以保证事务在提交之后数据不丢失。但是问题来了,如果事务执行到一半的时候需要回滚怎么办?比如一个事务里面有 4 个增删改语句,已经执行完两个了,Buffer Pool 的数据也被更新了,但是还有两个没有执行,而此时事务要回滚了,怎么办?

显然事务回滚的核心就在于,要将 Buffer Pool 里的数据变成事务执行前的状态,换句话说,就是把在 Buffer Pool 里执行的增删改操作给回滚了。

但问题是怎么回滚呢?由于 Buffer Pool 已经被修改了,所以在执行事务的时候,必须引入另外一种日志,也就是 undo log 日志。

undo log 日志记录的东西其实非常简单,用大白话解释就是:

  • 比如要执行一个 insert 语句,那么在 undo log 日志里就记录一条对应的 delete 语句。当回滚的时候,把 insert 插入的行给删掉即可。
  • 同理,如果要执行一个 delete 语句,那么在 undo log 日志里面就会把删除的行数据保存下来,并记录一条 insert 语句。当回滚的时候,再将删除的行插回去。
  • 如果要执行一个 update 语句,那么在 undo log 日志里面就会把更新前的值保存下来,回滚的时候再 update 回去。

所以回滚没有想象的那么神秘,就是针对每一个增删改语句,在 undo log 日志中都会记录一个与之相反的语句。当事务回滚时,执行相反的语句,将事务执行时对 Buffer Pool 所做的修改给抵消掉。注意:这里不包含 SELECT 语句,因为它没有涉及修改,所以 undo log 中不需要记录任何东西。

所以执行事务时,不仅要写 redo log,还要写 undo log。前者保证事务提交之后数据不丢失,后者保证事务能够回滚。


undo log 长什么样子



那么 undo log 长什么样子呢?首先不同语句对应的 undo log 的类型不同,比如 insert 语句对应的类型就是 TRX_UNDO_INSERT_REC,它里面包含了以下内容:

  • 该条日志的开始位置;
  • 构成主键的每一列的长度和值;
  • 表 ID;
  • undo log 日志编号;
  • undo log 日志类型;
  • 该条日志的结束位置;


解释一下每一部分的含义,首先每个日志都要有自己的开始位置和结束位置,这没什么好说的。

然后插入数据的时候,必然要有一个主键(可以单个字段、也可以是多个字段组成的复合主键),即使创建表时没有显式指定主键,MySQL 也会弄一个隐藏的字段 row_id 作为主键。所以构成主键的每一列的长度和值指的就是插入数据的主键的每个列,它的长度是多少,具体的值是什么。

接下来是表 ID,因为数据是插入到表里的,所以要记录是在哪张表里插入的数据。

undo log 日志编号,因为在一个事务里会有多条 SQL 语句,所以会有多个 undo log 日志。而每个 undo log 日志都是有自己的编号的,在每个事务里的 undo log 日志的编号都是从 0 开始,然后依次递增。

undo log 日志也是有类型的,insert 语句的 undo log 类型就是 TRX_UNDO_INSERT_REC。

假设你插入了一条数据,现在要回滚,那么把该语句对应的 undo log 拿出来。通过 undo log 可以得知是在哪张表插入的数据,以及主键是什么,然后通过 delete 语句再将它删除掉即可。

以上是 insert 语句的 undo log,其它语句与之类似。



本文参考自:

  • 儒猿技术窝《MySQL 实战高手》


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
2月前
|
SQL 存储 关系型数据库
美团面试:binlog、redo log、undo log的底层原理是什么?它们分别实现ACID的哪个特性?
老架构师尼恩在其读者交流群中分享了关于 MySQL 中 redo log、undo log 和 binlog 的面试题及其答案。这些问题涵盖了事务的 ACID 特性、日志的一致性问题、SQL 语句的执行流程等。尼恩详细解释了这些日志的作用、所在架构层级、日志形式、缓存机制以及写文件方式等内容。他还提供了多个面试题的详细解答,帮助读者系统化地掌握这些知识点,提升面试表现。此外,尼恩还推荐了《尼恩Java面试宝典PDF》和其他技术圣经系列PDF,帮助读者进一步巩固知识,实现“offer自由”。
美团面试:binlog、redo log、undo log的底层原理是什么?它们分别实现ACID的哪个特性?
|
6月前
|
存储 关系型数据库 MySQL
|
2月前
|
存储 SQL 关系型数据库
面试官:你能聊聊 binlog、undo log、redo log 吗?
本文详细解析了MySQL数据库中的三种日志:binlog、undo log和redo log。binlog用于记录数据库的所有表结构变更及数据修改,支持归档、主从复制和数据恢复;undo log用于事务回滚,确保事务的原子性和实现多版本控制;redo log则用于crash-safe,确保数据库异常重启后已提交记录不丢失。文章通过实例和图表,深入浅出地介绍了每种日志的特点、应用场景及其实现机制。适合数据库开发者和运维人员阅读。
167 2
|
2月前
|
存储 关系型数据库 MySQL
MySQL中的Redo Log、Undo Log和Binlog:深入解析
【10月更文挑战第21天】在数据库管理系统中,日志是保障数据一致性和完整性的关键机制。MySQL作为一种广泛使用的关系型数据库管理系统,提供了多种日志类型来满足不同的需求。本文将详细介绍MySQL中的Redo Log、Undo Log和Binlog,从背景、业务场景、功能、底层实现原理、使用措施等方面进行详细分析,并通过Java代码示例展示如何与这些日志进行交互。
208 0
|
3月前
|
存储 关系型数据库 MySQL
binlog、redolog、undo log底层原理及ACID特性实现分享
在数据库管理系统中,日志机制是确保数据一致性、完整性和可靠性的关键组件。MySQL数据库中的binlog、redolog和undolog作为其核心日志系统,各自扮演着不同但同样重要的角色。本文将深入探讨这三种日志的底层原理以及它们如何分别实现ACID(原子性、一致性、隔离性、持久性)特性的不同方面。
75 0
|
4月前
|
C# Windows 监控
WPF应用跨界成长秘籍:深度揭秘如何与Windows服务完美交互,扩展功能无界限!
【8月更文挑战第31天】WPF(Windows Presentation Foundation)是 .NET 框架下的图形界面技术,具有丰富的界面设计和灵活的客户端功能。在某些场景下,WPF 应用需与 Windows 服务交互以实现后台任务处理、系统监控等功能。本文探讨了两者交互的方法,并通过示例代码展示了如何扩展 WPF 应用的功能。首先介绍了 Windows 服务的基础知识,然后阐述了创建 Windows 服务、设计通信接口及 WPF 客户端调用服务的具体步骤。通过合理的交互设计,WPF 应用可获得更强的后台处理能力和系统级操作权限,提升应用的整体性能。
124 0
|
4月前
|
存储 SQL 关系型数据库
MySQL事务日志奥秘:undo log大揭秘,一文让你彻底解锁!
【8月更文挑战第24天】本文深入探讨了MySQL中undo log的关键作用及其在确保事务原子性和一致性方面的机制。MySQL通过记录事务前的数据状态,在需要时能回滚至初始状态。主要介绍InnoDB存储引擎下的undo log实现,包括undo segment和record的结构,而MyISAM则采用redo log保障持久性而非一致性。通过一个简单的SQL回滚示例,展示了undo log如何在实际操作中发挥作用,帮助读者更好地理解并运用MySQL事务管理功能。
404 0
|
关系型数据库 MySQL
Mysql Undo log
Mysql Undo log
115 0
Mysql Undo log
|
存储 SQL 缓存
【MySQL】change buffer,buffer pool,redo log,bin log,undo log的作用
【MySQL】change buffer,buffer pool,redo log,bin log,undo log的作用
154 0
|
7月前
|
存储 SQL 关系型数据库
[MySQL]事务原理之redo log,undo log
[MySQL]事务原理之redo log,undo log
186 0