初识 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 实战高手》


相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
10月前
|
存储 SQL 关系型数据库
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log、原理、写入过程;binlog与redolog区别、update语句的执行流程、两阶段提交、主从复制、三种日志的使用场景;查询日志、慢查询日志、错误日志等其他几类日志
786 35
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
|
9月前
|
存储 SQL 关系型数据库
mysql的undo log、redo log、bin log、buffer pool
MySQL的undo log、redo log、bin log和buffer pool是确保数据库高效、安全和可靠运行的关键组件。理解这些组件的工作原理和作用,对于优化数据库性能和保障数据安全具有重要意义。通过适当的配置和优化,可以显著提升MySQL的运行效率和数据可靠性。
215 16
|
9月前
|
存储 SQL 关系型数据库
mysql的undo log、redo log、bin log、buffer pool
MySQL的undo log、redo log、bin log和buffer pool是确保数据库高效、安全和可靠运行的关键组件。理解这些组件的工作原理和作用,对于优化数据库性能和保障数据安全具有重要意义。通过适当的配置和优化,可以显著提升MySQL的运行效率和数据可靠性。
169 4
|
存储 关系型数据库 MySQL
|
11月前
|
SQL 关系型数据库 MySQL
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
543 7
MySQL事务日志-Undo Log工作原理分析
|
9月前
|
SQL 存储 关系型数据库
简单聊聊MySQL的三大日志(Redo Log、Binlog和Undo Log)各有什么区别
在MySQL数据库管理中,理解Redo Log(重做日志)、Binlog(二进制日志)和Undo Log(回滚日志)至关重要。Redo Log确保数据持久性和崩溃恢复;Binlog用于主从复制和数据恢复,记录逻辑操作;Undo Log支持事务的原子性和隔离性,实现回滚与MVCC。三者协同工作,保障事务ACID特性。文章还详细解析了日志写入流程及可能的异常情况,帮助深入理解数据库日志机制。
1074 0
|
10月前
|
存储 关系型数据库 MySQL
图解MySQL【日志】——Undo Log
Undo Log(回滚日志)是 MySQL 中用于实现事务原子性和一致性的关键机制。在默认的自动提交模式下,MySQL 隐式开启事务,每条增删改语句都会记录到 Undo Log 中。其主要作用包括:
324 0
|
12月前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
330 3
|
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的哪个特性?
|
存储 SQL 关系型数据库
面试官:你能聊聊 binlog、undo log、redo log 吗?
本文详细解析了MySQL数据库中的三种日志:binlog、undo log和redo log。binlog用于记录数据库的所有表结构变更及数据修改,支持归档、主从复制和数据恢复;undo log用于事务回滚,确保事务的原子性和实现多版本控制;redo log则用于crash-safe,确保数据库异常重启后已提交记录不丢失。文章通过实例和图表,深入浅出地介绍了每种日志的特点、应用场景及其实现机制。适合数据库开发者和运维人员阅读。
693 2

热门文章

最新文章