空无以求全
宁静以致远
当前位置:首页 > .html

mysql redo和undo日志的区别

作者:大熊空间发布时间:2022-02-19 17:09分类: 浏览:288评论:0


导读:面试的时候,经常会被问到mysql的redo日志和undo日志,然后我又非常容易把它们弄混,分不清哪个是哪个,区别是什么。今天就彻底弄清记住redo日志和undo日志的区别。 字面...

面试的时候,经常会被问到mysql的redo日志和undo日志,然后我又非常容易把它们弄混,分不清哪个是哪个,区别是什么。今天就彻底弄清记住redo日志和undo日志的区别。

字面意义上

首先从字面意义上理解,redo重做undo撤销

  • undo: 撤销,也就是取消之前的操作。
  • redo: 重做,重新执行一遍之前的操作。

所以从这里也很容易看出和记住他们的作用。
redo重做是为了恢复。
比如系统崩溃了,机器宕机了,磁盘坏了。这时候重启机器之后需要将恢复数据,就需要用redo log
undo撤销是为了撤销操作
最简单的就是数据库事务,需要rollback的时候就要用到undo log

物理 vs 逻辑

从两者的作用也可以看出他们操作层面上的区别。
redo是物理层面上的,记录的是物理磁盘数据页的变化,而不是逻辑上的某条记录的内容变化。
undo是逻辑层面上的,比如一条数据库表记录,我们记录他的某个版本的变化。(MVCC)

事务层面 持久性 vs原子性

Undo 记录某 数据 被修改 前 的值,可以用来在事务失败时进行 rollback;
Redo 记录某 数据块 被修改 后 的值,可以用来恢复未写入 data file 的已成功事务更新的数据。
即,

Redo Log 保证事务的持久性
Undo Log 保证事务的原子性(在 InnoDB 引擎中,还用 Undo Log 来实现 MVCC)
比如某一时刻数据库 DOWN 机了,有两个事务,一个事务已经提交,另一个事务正在处理。数据库重启的时候就要根据日志进行前滚及回滚,把已提交事务的更改写到数据文件,未提交事务的更改恢复到事务开始前的状态。即,当数据 crash-recovery 时,通过 redo log 将所有已经在存储引擎内部提交的事务应用 redo log 恢复,所有已经 prepared 但是没有 commit 的 transactions 将会应用 undo log 做 roll back。


  • 参考资料:
  1. https://blog.csdn.net/IndexMan/article/details/7747720
  2. https://www.jianshu.com/p/57c510f4ec28

发表评论: