• 【MySQL】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

  • 相关阅读:
    多模态说话人开源项目3D-Speaker
    Java_网络多线程
    OpenStack 删除一个计算节点
    javascript 学习并梳理正则表达式姿势之字符串匹配( 一)
    Flutter 上传文件和保存在应用程序存储目录
    MapReduce编程:join操作和聚合操作
    猿创征文 | 【MyBatisPlus】再见了MyBatis我更喜欢Plus
    Docker12:Docker网络
    Ubuntu构建ESP32 ESP-IDF开发环境
    【LeetCode-面试经典150题-day20】
  • 原文地址:https://blog.csdn.net/m0_60511809/article/details/132839736