💖【Mysql高级特性】InnoDB Checkpoint概述
相关文章 | 地址 |
---|---|
初探 InnoDB 体系架构 | 初探 InnoDB 体系架构 |
💓 Checkpoint 技术背景
InnoDB 对于数据的 update 和 delete 改变了 缓存池中页的记录,那么此时缓存和页的数据比磁盘的数据要新, 数据库需要将新版本的页从缓存池刷新到磁盘中。如果说每做一次更新和删除操作,就把缓存中页的数据刷新到磁盘,那么开销非常大,而且如果把缓存池中页的新版本杀心到磁盘是发生了宕机,那么数据就不能恢复了。为了避免这种情况发生,当前事务数据库都采用了 Wrte Ahead Log 策略,即当事务提交时,先写重做日志,再修改页。当数据库宕机时,可以通过重做日志来完成数据的恢复。
💓Checkpoint 的职责与类型
Checkpoint 的职责 将缓存池中的脏页刷回磁盘 重点在于,每次刷新多少也到磁盘,每次从哪里取脏页,以及什么时候触发 Checkpoint
- Sharp Checkpoint 发生在数据库关闭时将所有脏页都刷回磁盘
- Fuzzy Checkpoint 之刷新一部分脏页,而不是刷新所有脏页回磁盘
- Master Thread Checkpoint:每秒或者10秒的频率异步刷新缓冲池的脏页到磁盘。(由Page Cleaner Thread完成)
- FLUSH_LRU_LIST Checkpoint:缓冲池不够用时,根据LRU算法会淘汰掉最近最少使用的页,如果该页是脏页的话,会强制执行CheckPoint,将该脏页刷回磁盘(由Page Cleaner Thread完成);
- Async/Sync Flush Checkpoint:重做日志不可用的情况,需要强制从脏页列表中选取一些脏页刷新磁盘到缓存(由Page Cleaner Thread完成)。
💓Checkpoint 主要解决的问题
- 缩短数据库的恢复时间
- 缓冲池不够用将脏页刷新到磁盘
- 重做日志不可用时,刷新脏页
当数据库宕机时 , 数据库不需要重做所有的日志,因为CheckPoint 之前的页已经刷回磁盘,只需对checkpoint后的重做日志进行恢复。这样就大大缩短了恢复时间。
对于 重做日志来说,没有必要让他无限增大,重做日志的设计都是循环使用的,如果数据库恢复不需要这部分日志,那么他就是可以被覆盖重用。若此时当前重做日志还需要被使用,不可以被覆盖,那么必须强制产生 Checkpoint,将缓冲池中的页至少刷新到当前重做日志的位置。