checkPoint

目的:

  1. 缩短数据库的回复时间
  2. 缓冲池不够用时,将脏页刷新到磁盘
  3. redo log不可用时,刷新脏页

机制

数据库发生宕机时,不需要重做所有的日志,只需要对CheckPoint之后的日志进行恢复,因为CheckPoint之前的页已经刷新回了磁盘。
当缓存池不够用时,根据LRU算法若溢出的页为脏页,则需要强制执行CheckPoint。
在InnoDB存储引擎中,Checkpoint发生的时间、条件及脏页的选择等都非常复杂。而Checkpoint所做的事情无外乎是将缓冲池中的脏页刷回到磁盘。不同之处在于每次刷新多少页到磁盘,每次从哪里取脏页,以及什么时间触发Checkpoint。在innodb引擎中,有两种CheckPoint:
Sharp Checkpoint
Fuzzy Checkpoint
sharp checkPoint发生在数据库关闭时将所有的脏页刷新回磁盘,也是默认的工作方式,即innodb_fast_shutdown = 1。
在innodb引擎内部使用fuzzy checkpoint进行脏页的刷新,每次只刷新一部分脏页,而不是刷新所有的脏页。
在InnoDB存储引擎中可能发生如下几种情况的 Fuzzy Checkpoint:
❑Master Thread Checkpoint
❑FLUSH_LRU_LIST Checkpoint
❑Async/Sync Flush Checkpoint
❑Dirty Page too much Checkpoin
对于Master Thread中发生的Checkpoint,差不多以每秒或每十秒的速度从缓冲池的脏页列表中刷新一定比例的页回磁盘。这个过程是异步的,即此时InnoDB存储 引擎可以进行其他的操作,用户查询线程不会阻塞。
FLUSH_LRU_LISTCheckpoint是因为InnoDB存储引擎需要保证LRU列表中需要有差不多100个空闲页可供使用。在InnoDB1.1.x版本之前,需要检查LRU列表中是否有足够的可用空间操作发生在用户查询线程中,显然这会阻塞用户的查询操作。倘若没有100个可用空闲页,那么InnoDB存储引擎会将LRU列表尾端的页移除。如果这些页中有脏页,那么需要进行Checkpoint,而这些页是来自LRU列表的,因此称为FLUSH_LRU_LISTCheckpoint。而从MySQL5.6版本,也就是InnoDB1.2.x版本开始,这个检查被放在了一个单独的PageCleaner线程中进行,并且用户可以通过参数innodb_lru_scan_depth控制LRU列表中可用页的数量,该值默认为1024。
image.png
Async/Sync Flush Checkpoint指的是重做日志文件不可用的情况,这时需要强制将一些页刷新回磁盘,而此时脏页是从脏页列表中选取的。Async/Sync Flush Checkpoint是为了保证重做日志的循环使用的可用性。在InnoDB 1.2.x版本之前,Async Flush Checkpoint会阻塞发现问题的用户查询线程,而Sync Flush Checkpoint会阻塞所有的用户查询线程,并且等待脏页刷新完成。从InnoDB 1.2.x版本开始——也就是MySQL 5.6版本,这部分的刷新操作同样放入到了单独的Page Cleaner Thread 中,故不会阻塞用户查询线程。
最后一种Checkpoint的情况是Dirty Page too much,即脏页的数量太多,导致InnoDB存储引擎强制进行Checkpoint。其目的总的来说还是为了保证缓冲池中有足够可用的页。其可由参数innodb_max_dirty_pages_pct控制:
image.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值