2026-10-21 18:25:35
数据库事务日志(Redo Log/Undo Log)的作用与恢复机制
数据库事务日志是保障数据完整性和高可用性的核心机制,其中Redo Log(重做日志)和Undo Log(撤销日志)分别通过“向前恢复”和“向后回滚”实现事务的持久性(Durability)、原子性(Atomicity)及隔离性(Isolation)。以下从作用、恢复机制及协同关系三方面展开分析:
一、Redo Log的作用与恢复机制核心作用:确保事务的持久性,即已提交的数据永不丢失。实现原理:
分析阶段:数据库重启后,从检查点(Checkpoint)扫描Redo Log,识别崩溃前未提交的事务和“脏页”(内存修改未刷盘的数据页)。
重做阶段:顺序重放Redo Log中的所有已提交事务操作,将数据页恢复至崩溃前的最新状态,确保持久性。
撤销阶段:利用Undo Log回滚未提交事务的修改(见下文Undo Log部分)。
解决的问题:
核心作用:保障事务的原子性和隔离性,支持事务回滚与多版本并发控制(MVCC)。实现原理:
事务回滚:
事务修改数据前,将旧值记录到Undo Log。若事务失败或用户执行ROLLBACK,数据库根据Undo Log逆向操作,恢复数据至事务开始前的状态。
例如:事务A修改数据X的值为Y,Undo Log记录旧值X=Z;回滚时将X重置为Z。
多版本并发控制(MVCC):
版本链构建:事务修改数据时,不直接覆盖原数据,而是创建新版本,并将旧版本指针存入Undo Log,形成版本链。
读操作可见性:读事务根据隔离级别(如读已提交、可重复读)和事务开始时间,沿版本链追溯符合规则的旧版本,避免阻塞写操作。
垃圾回收:无活跃事务访问的旧版本会被异步清理,释放存储空间。
解决的问题:
两者共同构建数据库的ACID特性:
崩溃恢复流程:
Redo Log主导:通过重做阶段恢复所有已提交事务的修改,确保数据持久性。
Undo Log辅助:在撤销阶段回滚未提交事务的修改,保证原子性。
性能与可靠性平衡:
Redo Log通过顺序写入磁盘日志文件,减少随机I/O,提升写入性能。
Undo Log通过保存旧版本支持MVCC,避免读写锁冲突,提升并发度。
典型场景示例:
场景1:事务提交后服务器崩溃。重启后,Redo Log重做已提交操作,Undo Log忽略无回滚需求。
场景2:事务未提交时崩溃。Redo Log可能包含未提交修改,但Undo Log会撤销这些操作,确保数据一致性。