跳转至

Redo、Undo Log

参考 https://zhuanlan.zhihu.com/p/459927901

Redo Log是在日志文件中已经记录了commit事务,然后再将事务修改的数据持久化到数据库中。
Undo Log是在日志文件中记录了事务修改前数据之后,就持久化到数据库,然后再在日志中记录commit事务。

1 Redo Log

Redo Log(重做日志)是为了系统崩溃之后恢复数据用的,让数据库照着日志,把没做好的事情重做一遍。 有了 Redo Log,就可以保证即使数据库发崩溃重启后,之前提交的记录都不会丢失,这个能力称为 crash-safe。

  • 使用 redo log 时事务执行顺序(步骤 1、2、3、5 记录在日志中):
1. 记录START 事务T
2. 记录事务需要修改记录的新值(要求持久化)
3. 记录COMMIT 事务T(要求持久化)
4. 将事务相关的修改写入数据库 
5. 记录End 事务T

当故障发生时,日志中以下几种情况: 1. 记录了 start 事务,但没有 commit 事务。(忽略此日志,因为此事务还没有提交到数据库) 2. 记录了 start 事务,有 commit 事务,但没有 end 事务。(重做此事务,可能有部分数据持久化到数据库) 3. 记录了 start 事务,也有 commit 事务、end 事务。(忽略此事务,此事务已经持久化到数据库)

2 Undo Log

Undo Log(回滚日志)是为了回滚用的。 在事务提交之前就开始写数据,万一事务到最后又打算不提交了,要回滚,或者系统崩溃了,这些提前写入的数据就变成了脏数据,这时候就必须用 Undo Log 恢复了。

  • 使用 undo log 时事务执行顺序 (步骤 1、2、4 记录在日志中):
1. 记录START T 
2. 记录需要修改的记录的旧值(要求持久化)
3. 根据事务的需要更新数据库(要求持久化)
4. 记录COMMIT T

当故障发生时,扫描日志,找出 所有已经 START, 还没有 COMMIT 的事务,这些事务就需要回滚。