1. redo log 与 undo log
Q: redo log(重做日志)的作用是什么?
基本原理
要求数据库在写磁盘之前把事务所有的操作都先记录下来,以日志的形式写到磁盘中,然后数据库根据日志上的信息对真正的数据进行修改。
保证持久性
如果修改数据的过程中系统崩溃了,重启后只要再根据日志的内容重新操作一遍就行了,这就保证了持久性。
保证原子性
如果日志还没写完系统就崩溃了,系统重启后,数据库一看日志里没有Commit Record,就说明日志是不完整的,还没有写完,那么就将这部分日志标记为回滚状态,整个事务就回滚了,这就保证了原子性。
总结
Redo Log(重做日志)是为了系统崩溃之后恢复数据用的,让数据库照着日志,把没做好的事情重做一遍。有了Redo Log,就可以保证即使数据库发生崩溃重启后,之前提交的记录都不会丢失,这个能力称为crash-safe。
Q: undo log(回滚日志)的作用是什么?
解决性能问题
当事务中数据量特别大的时候,等全部变更完写入Redo log日志,再统一写入磁盘,性能就比较低,所以就希望在数据还没有提交的时候就将一些数据写入到磁盘中。
回滚保障
但是这样有一个问题:如果事务回滚,提前写入的数据就是脏数据,还需要将数据进行恢复,所以就引入了undo log:
- 在写数据之前记录都写了什么数据,在什么地方改的
- 到时候如果事务回滚之后,还可以按照undo log日志,恢复到之前的数据
支持MVCC
undo log还可以实现MVCC,当读取的某一行被其他事务锁定的时候,它就可以从undo log中获取该行之前的数据是什么,提供该行的一个版本信息。
总结
Undo Log(回滚日志)是为了回滚用的。在事务提交之前就开始写数据,万一事务到最后又打算不提交了,要回滚,或者系统崩溃了,这些提前写入的数据就变成了脏数据,这时候就必须用Undo Log恢复了。
Q: redo log 和 undo log 的区别?
| 对比项 | redo log | undo log |
|---|---|---|
| 作用 | 重做,恢复提交的事务 | 回滚,撤销未提交的事务 |
| 保证特性 | 持久性 + 原子性 | 一致性 + MVCC支持 |
| 日志类型 | 物理日志(记录页的物理修改) | 逻辑日志(记录SQL的逆操作) |
| 写入时机 | 事务提交前必须写入 | 事务执行过程中写入 |
| 使用场景 | 系统崩溃后重做已提交事务 | 事务回滚、MVCC快照读 |
记忆口诀:redo向前看(重做已提交),undo向后看(回滚未提交)。