Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQ回滚Undo Log

MySQ回滚日志Undo Log实践记录

作者:M_Reus_11

Undo Log是一种用于撤销操作的日志,它记录了事务发生之前的数据状态(主要是修改前的旧版本数据),本文给大家介绍MySQ回滚日志Undo Log实践记录,感兴趣的朋友一起看看吧

Undo Log 是 InnoDB 存储引擎中实现事务关键组件之一。它与 Redo Log 共同协作,确保了事务的原子性(Atomicity)和一致性(Consistency),同时也是 MySQL 实现多版本并发控制(MVCC) 的基础。

一、什么是 Undo Log?

Undo Log,顾名思义,是一种用于撤销操作的日志。它记录了事务发生之前的数据状态(主要是修改前的旧版本数据)。

当执行一个 DELETEUPDATE 或 INSERT 操作时,InnoDB 不仅会生成 Redo Log 用于重做,还会生成相应的 Undo Log。如果事务需要回滚(ROLLBACK)或者系统崩溃后进行恢复,InnoDB 就可以利用 Undo Log 中的信息,将数据还原到修改前的状态。

核心思想: 在修改任何数据之前,先“留底”,把旧数据拷贝一份到 Undo Log 中。

二、Undo Log 的主要作用

三、Undo Log 的存储与结构

1. 物理存储

2. 逻辑结构 - 版本链

每一行记录(聚簇索引)在 InnoDB 中都包含两个隐藏字段:

UPDATE 操作会形成一个版本链:

这样,通过 DB_ROLL_PTR,所有历史版本的数据就像一条链表一样被串联起来,这就是版本链

示例:
假设一行数据初始值为 Name=‘Alice’

这行记录及其版本链的结构如下:

当前行 (In Table)   : [Name='Charlie', DB_TRX_ID=200, DB_ROLL_PTR --> Undo Record 200]
                      ^
                      |
Undo Record 200      : [Name='Bob',    DB_TRX_ID=100, DB_ROLL_PTR --> Undo Record 100]
                      ^
                      |
Undo Record 100      : [Name='Alice',  DB_TRX_ID=?,   DB_ROLL_PTR -> NULL]

当有一个 Read View 需要查询这行数据时,它会从最新的记录开始,顺着 DB_ROLL_PTR 依次判断哪个版本对它可见。

四、Undo Log 与 Redo Log 的区别

这是一个非常重要的概念,两者的区别和联系如下表所示:

特性Redo LogUndo Log
目的重做日志,确保事务的持久性回滚日志,确保事务的原子性一致性读(MVCC)
内容记录的是数据页的物理变化(在某个页上做了什么修改)记录的是数据修改前的逻辑状态(行的旧值)
生成时机在事务执行过程中不断写入在数据修改生成
作用时机数据库崩溃恢复时,重放已提交的事务事务回滚时和一致性读(MVCC) 时
生命周期事务提交后,对应的 Redo Log 可能很快被覆盖(循环写)事务提交后,Undo Log 可能仍被 MVCC 使用,不能立即删除
磁盘存储顺序写入(ib_logfile0/1随机写入(存在于表空间)
日志类型物理逻辑日志(物理到页,逻辑到行)逻辑日志

关键联系: Undo Log 本身的操作(写入、修改)也会产生 Redo Log。因为 Undo Log 也需要持久化,防止在写入 Undo Log 过程中发生崩溃导致数据不一致。这被称为 “Redo Log for Undo Log”

五、相关参数与最佳实践

最佳实践

总结

Undo Log 是 InnoDB 引擎的基石之一,它远不止是“回滚”那么简单。它的核心价值在于:

理解 Undo Log 的工作原理,对于深入掌握 MySQL 的事务机制、MVCC 以及进行性能调优和故障排查都至关重要。

到此这篇关于MySQ回滚日志Undo Log实践记录的文章就介绍到这了,更多相关MySQ回滚Undo Log内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文