跳至内容
1. redo log 与 undo log

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 logundo log
作用重做,恢复提交的事务回滚,撤销未提交的事务
保证特性持久性 + 原子性一致性 + MVCC支持
日志类型物理日志(记录页的物理修改)逻辑日志(记录SQL的逆操作)
写入时机事务提交前必须写入事务执行过程中写入
使用场景系统崩溃后重做已提交事务事务回滚、MVCC快照读
记忆口诀:redo向前看(重做已提交),undo向后看(回滚未提交)。