在MySQL执行流程中,Undo Log具体是在哪个阶段被写入的?

梦伟酱_9213

梦伟酱_9213

2026-08-07

138人浏览

原创

undo log 写入发生在事务执行阶段,早于 redo log prepare;它在dml语句执行时即同步写入undo log buffer,是修改流程的第一步,为回滚和mvcc提供前镜像并确保崩溃恢复时undo链完整。

在mysql执行流程中,undo log具体是在哪个阶段被写入的?

Undo Log 写入发生在事务执行阶段,早于 Redo Log Prepare

Undo Log 的写入不是等到事务提交才发生,而是在 UPDATE、DELETE 或 INSERT 这类 DML 语句真正执行时就立即写入内存的 Undo Log Buffer。它比 Redo Log 的 prepare 阶段更早,是整个修改流程的第一步。

常见错误现象:有人看到 SHOW ENGINE INNODB STATUS 中 “undo log records” 数量增长滞后,误以为 Undo Log 是提交时才写;其实只是刷盘(到磁盘 Undo 表空间)异步延迟,写入内存是同步且前置的。

  • 执行 UPDATE users SET balance = 200 WHERE id = 1 时,InnoDB 先从 Buffer Pool 读取该行,再把原值(比如 balance=100)写入 Undo Log Buffer
  • 这个动作和后续修改 Buffer Pool 数据页、写入 Redo Log Buffer 是原子性串联的——Undo 必须先记,才能保证回滚有据可依
  • TRX_UNDO_INSERT 类型(来自 INSERT)在事务提交后立刻释放;TRX_UNDO_UPDATE 类型(来自 UPDATE/DELETE)则保留在内存+磁盘,供 MVCC 使用,直到 purge 线程清理

为什么 Undo Log 必须在 Redo Log Prepare 之前写入?

因为 Redo Log 记录的是“物理变更”,而 Undo Log 提供的是“逻辑前镜像”。InnoDB 在生成 Redo Log 时,会把 Undo Log 页的修改也一并记录进去(即 Undo 操作本身也要被 redo 保护),所以 Undo Log 的分配和初始化必须先行完成。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载

如果顺序颠倒——比如先写 Redo Log 再写 Undo Log——那崩溃恢复时可能拿到一个不完整的 Undo 链,导致回滚失败或 MVCC 读取到错误版本。

  • 事务开始时,InnoDB 会为它分配一个回滚段 slot,并初始化第一个 Undo page header
  • 每次写入新 Undo record 前,都要更新 roll_pointer 和 trx_id 隐藏字段,这些操作本身会产生 Redo Log
  • 因此,Undo Log 的写入不仅是用户可见的“记录旧值”,更是底层存储结构初始化的关键环节

容易被忽略的刷盘时机差异

很多人混淆“写入内存”和“持久化到磁盘”——Undo Log 的内存写入是即时的,但刷盘到 Undo 表空间(如 undo_001.ibu)是异步的,由后台线程控制,不受 innodb_flush_log_at_trx_commit 影响。

这导致一个典型问题:长事务未提交时,Undo Log 在内存中持续增长,但磁盘上看不到对应文件膨胀;而一旦事务提交,TRX_UNDO_UPDATE 类型的记录又不会马上删除,而是挂入 history list,等待 purge 线程回收——此时磁盘空间才真正开始缓慢释放。

  • 检查 Undo 空间压力,不能只看 information_schema.INNODB_METRICS 中的 undo_log_records_added,更要关注 history_list_length
  • innodb_max_undo_log_size 控制单个 Undo 表空间大小上限,但 purge 延迟会导致实际占用远超该值
  • 若发现 purge lag 持续上升,说明历史版本堆积,MVCC 快照读性能会下降,甚至触发 ERROR 1205 (HY000): Deadlock found when trying to get lock
真实场景里,Undo Log 的写入点看似简单,但它卡在事务生命周期最前端,牵动着回滚、MVCC、purge 三个关键机制。稍有误解,排查死锁、长事务阻塞或主从延迟时就会绕弯路。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2173

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1339

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

775

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

2972

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

4988

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1139

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

5251

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

4622

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

6114

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 183人学习