【MySQL】redo log 、 undo log、脏页这些概念是什么?

  • redo log(重做日志)
    • redo log 是什么
    • redo log 的主要作用
    • Redo 的组成
    • redo如何保证 事务的持久性
  • undo log(撤销日志/回滚日志)
    • undo log 是什么
    • redo log 的主要作用
    • undo的存储位置
  • 如何区分 redo log和undo log
  • 感谢
  • 参考

首先,事务有四大特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
一个事务,要么全部执行,要么全部不做。事务的隔离性由锁机制实现,原子性、一致性和持久性由事务的redo 日志和undo 日志来保证。

先来分别看看redo log和 undo log

redo log(重做日志)

redo log 是什么

redo log主要是物理Redo日志,记录的是数据页的物理变化。即对数据库的所有修改,包括插入、更新和删除操作。能够保证事务的持久性和一致性。

redo log 的主要作用

redo log的主要作用是用于数据库的崩溃恢复。可以根根据edo log中记录的信息进行重新应用,以恢复到故障点之前。

Redo 的组成

Redo log可以简单分为以下两个部分:

  • 一是在内存中会有一个重做日志缓冲 (redo log buffer),在修改完数据后将新的数据写入磁盘中之前,会现在内存中的redo log buffer中记录下来。不过它是是易失的
  • 二是磁盘中会有一个重做日志文件 (redo log file),当事务commit时。会将redo log buffer中的内容刷新到 redo log file。这里的数据是持久的

所以我们知道,在内存中修改完数据页之后,这个时候还没有将这个数据页刷如磁盘,这个页就叫脏页(dirty page)。这个时候,会在内存中的redo log buffer写入redo日志,记录的是数据被修改后的值。这里注意在内存中是先修改数据页再写日志。接着会将内存中的redo日志写会磁盘中的redo log file,之后再将脏页刷入磁盘。

redo如何保证 事务的持久性

1.写入磁盘的顺序和持久性:在事务执行期间,MySQL首先将事务的更改写入Redo log缓冲区,然后异步将Redo log缓冲区的内容定期刷新到磁盘上的Redo log文件中。这个过程是按顺序执行的,确保了Redo log的顺序性。即使在事务提交之前,Redo log的内容也已经被持久地写入磁盘。这确保了即使系统崩溃,已提交的事务的更改也可以被重放,从而维护数据库的一致性
2. Redo log文件的循环写入:Redo log文件是循环写入的,一旦一个Redo log文件写满,MySQL会开始写入下一个。如果系统运行足够长的时间,旧的Redo log文件可能被覆盖。然而,在写入新的Redo log文件之前,MySQL会确保将所有相关的更改写入磁盘,以保证已提交的事务的持久性
3. 恢复过程:如果MySQL发生故障,如崩溃或断电,系统会在重新启动时执行恢复过程。在这个过程中,MySQL会检查Redo log文件,找到最后一个已经提交的事务,然后从Redo log中重新执行这些事务的更改,以将数据库恢复到一致的状态。这确保了在故障后,数据库可以重新回到最后一个一致的状态

undo log(撤销日志/回滚日志)

undo log 是什么

undo log是逻辑日志,主要记录的是数据的逻辑变化,为了在发生错误时回滚之前的操作,需要将之前的操作都记录下来,然后在发生错误时才可以回滚。

redo log 的主要作用

undo日志只将数据库逻辑地恢复到原来的样子,在回滚的时候,它实际上是做的相反的工作,比如一条INSERT ,对应一条 DELETE,对于每个UPDATE,对应一条相反的 UPDATE,将修改前的行放回去。undo日志用于事务的回滚操作进而保障了事务的原子性

undo的存储位置

在InnoDB存储引擎中,undo存储在回滚段(Rollback Segment)中,每个回滚段记录了1024个undo log segment,而在每个undo log segment段中进行undo 页的申请,在5.6以前,Rollback Segment是在共享表空间里的,5.6.3之后,可通过 innodb_undo_tablespace设置undo存储的位置

如何区分 redo log和undo log

  • 目的和功能:

    • Redo Log (重做日志): 主要用于数据库的持久性和恢复,记录了对数据的实际更改,以便在系统崩溃时能够重新执行这些更改,确保数据的一致性和持久性。它是用于恢复的,以保证数据的可恢复性
    • Undo Log (撤销日志): 主要用于事务的隔离性、回滚和多版本并发控制 (MVCC),记录了对数据的逆操作,以便能够回滚事务或提供读一致性视图。它是用于维护事务的隔离性和一致性的
  • 存储位置和方式:

    • Redo Log: 存储在独立的redo log文件中,通常是多个文件,用于记录事务的持久性更改。这些文件是循环写入的,以便不断覆盖旧的redo log记录
    • Undo Log: 存储在表空间中,通常是InnoDB存储引擎的一部分,用于记录事务的逆操作,以便回滚或提供读一致性视图
  • 记录的内容:

    • Redo Log: 记录了对数据的实际更改,包括插入、更新和删除操作的详细信息,以便能够重放这些更改
    • Undo Log:主要记录了数据的逻辑变化,比如一条INSERT语句,对应一条DELETE的undo log,对于每个UPDATE语句,对应一条相反的UPDATE的undo log,这样在发生错误时,就能回滚到事务之前的数据状态
  • 使用场景:

    • Redo Log: 在数据库崩溃或故障时,用于恢复数据到最新一致状态
    • Undo Log: 用于事务的隔离性、回滚和MVCC实现,以确保事务之间的数据隔离和一致性

感谢

好啦,这次的分享就到这里,感谢大家看到这里

参考

https://www.jianshu.com/p/20e10ed721d0
https://zhuanlan.zhihu.com/p/190886874

你可能感兴趣的:(mysql,数据库)