在MySQL中Undo Log与Redo Log在崩溃恢复时的协作流程是怎样的

小静君_3777

小静君_3777

2026-10-22

705人浏览

原创

崩溃恢复必须先redo再undo,因为需先用redo log将所有已记录的物理变更重放到数据页,确保页状态完整可逆;若先undo,未提交事务的中间修改可能已部分刷盘且未被覆盖,导致数据页处于错误中间态,破坏原子性。

在mysql中undo log与redo log在崩溃恢复时的协作流程是怎样的

崩溃恢复时为什么必须先 redo 再 undo

因为恢复的目标是让数据页回到崩溃前的“最新一致状态”,而不是直接回滚。如果先执行 undo log,未提交事务的中间修改可能已被部分刷盘,又没被重放覆盖,会导致内存页处于错误中间态——破坏原子性。只有先用 redo log 把所有已写入日志的物理变更(无论事务是否提交)全部重放到数据页上,才能确保页状态完整、可逆。

常见错误现象:人为删除或截断 ib_logfile* 后强行启动 MySQL,redo log 扫描起点错乱,导致重做阶段卡在 redo log parsing completed 之前,实例 hang 住无法完成恢复。

  • 恢复顺序不可配置、不可跳过,由 InnoDB 启动逻辑硬编码决定
  • redo log 重做不依赖 undo log 是否可用;但 undo log 回滚必须基于重做后的页状态
  • 若 undo log 段损坏(如 ibdata1 尾部坏块),恢复可能在第二阶段报 ERROR 1030 (HY000): Got error 168 from storage engine

Redo Phase 实际做了什么

这个阶段只读取并应用 redo log 中从 checkpoint LSN 开始的所有日志记录,对 Buffer Pool 中对应的数据页执行原样修改(比如把 page 123 offset 456 处的字节从 0x11 改成 0x22)。它不解析 SQL,不查事务状态,也不写磁盘——只是把日志里记的物理操作再执行一遍。

容易踩的坑:innodb_flush_log_at_trx_commit=0 或 =2 时,崩溃后会丢失部分已提交事务的 redo log 记录,这部分事务无法恢复,不是 bug,是配置明确放弃持久性保障的结果。

  • 日志扫描起点来自 ibdata1 中存储的最后 checkpoint 位置,不是从头读整个 ib_logfile*
  • 重做耗时主要取决于脏页数量和磁盘 I/O 性能,SSD 上通常秒级;HDD 上若待重做记录超百万条,可能持续数分钟
  • 日志中出现大量 Applying log record 行,且紧随 Starting crash recovery from checkpoint LSN=...,说明正在重做

Undo Phase 如何识别并清理未提交事务

重做完成后,InnoDB 扫描 undo log 段,查找所有标记为 ACTIVE 的事务(即没有 TRX_UNDO_CACHED 或 TRX_UNDO_TO_FREE 状态的事务),用其记录的前镜像执行反向操作:对 INSERT 做 DELETE,对 UPDATE 做逆向 UPDATE,对 DELETE 做反向 INSERT。

MySQL
MySQL

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

下载

关键点在于:这个阶段只处理未提交事务,已提交事务的修改已在 Redo Phase 固化,不会被 undo 影响。

  • long running transaction 会阻塞 undo log 清理,导致 ibdata1 持续膨胀,甚至触发 ERROR 1114 (HY000): The table is full
  • 可通过 SELECT * FROM information_schema.INNODB_TRX WHERE TIME_TO_SEC(TIMEDIFF(NOW(), TRX_STARTED)) > 60 快速定位运行超 60 秒的事务
  • innodb_undo_tablespaces 配置启用独立 undo 表空间后,ibdata1 不再承载 undo 段,避免共享表空间无限增长

两次写(double write)如何配合 redo 恢复

redo log 只能修复“内容正确但未刷盘”的页,无法修复“写了一半就崩溃”的半页(torn page)。这时候 dblwr 文件起关键作用:InnoDB 刷脏页前,会先将完整页拷贝到 #ib_*.dblwr 文件中。崩溃重启后,MySQL 先加载这些 dblwr 页面,用它们修复损坏的数据页,再应用 redo log。

典型问题:若 innodb_doublewrite=OFF,且磁盘发生部分写失败,崩溃恢复时可能因数据页损坏而直接报错退出,无法继续。

  • dblwr 文件默认位于 MySQL 数据目录下,文件名形如 #ib_16384_0.dblwr
  • 恢复过程中若发现某数据页校验失败(checksum mismatch),会尝试从 dblwr 中找对应页副本进行替换
  • 该机制与 redo log 协同,构成崩溃恢复的底层安全边界,不可绕过

实际恢复链条非常紧凑:checkpoint LSN → 加载 dblwr → 修复损坏页 → 重放 redo → 构建完整内存页 → 扫描 undo → 回滚活跃事务。任何一环缺失或损坏,都会中断恢复流程。最常被忽略的是 dblwr 文件权限异常或磁盘空间满导致其写入失败——此时即使 redo log 完好,也无法完成页修复。

相关文章

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

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

下载

相关标签:

mysql

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

相关专题

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

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

2023.06.20

2313

6

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

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

2023.06.21

1399

5

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

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

2023.07.18

835

5

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

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

2023.07.19

3212

5

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

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

2023.07.25

5448

4

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

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

2023.08.08

1199

3

sqlserver和mysql区别
sqlserver和mysql区别

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

2023.08.11

5711

4

mysql忘记密码
mysql忘记密码

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

2023.08.14

4982

7

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

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

2023.08.16

6654

11

热门下载

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

精品课程

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

共1课时 | 189人学习