Redo Log 是 InnoDB 实现崩溃恢复的核心物理日志,通过 WAL 机制确保已提交事务修改不丢失;其顺序写入、循环复用及前滚+回滚两阶段恢复机制保障数据一致性和高效性。
Redo Log 是 SQL 数据库(尤其是 InnoDB 存储引擎)实现崩溃恢复(Crash Recovery)的核心机制。它通过记录所有已提交事务的物理修改,确保数据库在意外宕机后能重放(Replay)这些变更,从而将数据恢复到一致、最新的状态。
Redo Log 不是 SQL 语句或逻辑操作,而是对数据页(Page)的物理变更描述,例如“将 page 123 的 offset 48 处的 4 字节从 0x11223344 改为 0x55667788”。这种设计带来两个关键优势:
数据库通过 Write-Ahead Logging(WAL)原则强制约束:任何数据页的修改落盘前,对应的 Redo Log 必须先持久化到磁盘(默认由 innodb_flush_log_at_trx_commit 控制)。这意味着:
实例异常终止后,InnoDB 在启动时自动触发恢复流程,核心步骤如下:
Redo Log ≠ Binlog:前者是 InnoDB 引擎层物理日志,用于本地崩溃恢复;后者是 Server 层逻辑日志,用于主从复制和 PITR(时间点恢复),两者无直接替代关系
。
Redo Log 文件不是无限增长:它采用循环覆写方式(ring buffer),由 checkpoint 推进清理边界;若写入速度持续超过 checkpoint 刷盘速度,会导致“Redo Log too large”等待,进而拖慢事务提交。
恢复速度取决于 Redo Log 量,而非数据总量:一次宕机后,如果期间只产生了 10MB Redo 日志,哪怕数据库有 1TB 数据,恢复也只需重放这 10MB —— 这正是 WAL 设计高效的关键。