zoukankan      html  css  js  c++  java
  • undo log和redo log

    概念

    数据库文件data file;

    数据库缓存db buffer;

    日志缓存log buffer;

    磁盘日志文件log file;

    Undo日志记录某数据被修改前的值,可以用来在事务失败时进行rollback;Redo日志记录某数据块被修改后的值,可以用来恢复未写入data file的已成功事务更新的数据。
    例如某一事务的事务序号为T1,其对数据X进行修改,设X的原值是5,修改后的值为15,那么Undo日志为<T1, X, 5>,Redo日志为<T1, X, 15>。
    undo和redo结合起来的做法,叫做Undo/Redo日志,在这个例子中Undo/Redo日志为<T1, X, 5, 15>。
    当用户生成一个数据库事务时,undo log buffer会记录被修改的数据的原始值,redo会记录被修改的数据的更新后的值。
    redo日志应首先持久化在磁盘上,然后事务的操作结果才写入db buffer,(此时,内存中的数据和data file对应的数据不同,我们认为内存中的数据是脏数据),
    db buffer再选择合适的时机“刷盘”,将数据持久化到data file中。这种顺序可以保证在需要故障恢复时恢复最后的修改操作。

    在innodb中用户提交事务完成以后,有可能数据还没有写到磁盘,此时内存中的db buffer和数据文件内容不一致,这种页面称为脏页,将脏页记录到磁盘的过程称为刷脏。
    刷脏有两种算法:flush-list(时间管理缓冲池刷脏)和LRU-list(最近最久未使用【使用频率】)。mysql5.6开始引入了page cleaner线程,专门负责刷脏。
    1,LRU-list-flush,其目的是为了在 LRU 链表尾部释放足够的free pages;当 buf pool 满的时候, 用户可以立即获得空闲页面,而不需要长时间等待; Flush-list-flush,其目的是推进 Checkpoint LSN,使得 InnoDB 系统崩溃之后能够快速的恢复。
    2,LRU-list-flush,释放后的free page,需要移动到 LRU 链表的尾部(MySQL 5.6.2 之前版本);或者是直接从 LRU 链表中删除,移动到 free list(MySQL 5.6.2 之后版本)。 Flush-list-flush,不需要移动 page 在 LRU 链表中的位置。
    3,LRU-list-flush,每次 flush 的 dirty pages 数量较少,基本固定,只要释放一定的 free pages即可; Flush-list-flush,根据当前系统的更新繁忙程度,动态调整一次 flush 的 dirty pages数量更大。

  • 相关阅读:
    Android ImageView设置图片原理(下)
    C++ 虚函数表 多重继承
    C++ 虚函数表 单继承
    私有继承
    内联函数和宏定义的区别
    #pragma pack(x) CPU对齐
    static 变量(静态变量)
    C++ 中const作用
    如何连接宏参数
    几种常见容器比较和分析 hashmap, map, vector, list ...hash table
  • 原文地址:https://www.cnblogs.com/shizheyangde/p/7390122.html
Copyright © 2011-2022 走看看