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数量更大。

 

posted @ 2017-08-18 15:55  一苇过江  阅读(3955)  评论(1编辑  收藏  举报