点击上方"蓝字"
关注我们,享更多干货!
MySQL为了保证数据会做很多checkpoint动作。特别是InnoDB采用Write Ahead Log策略来防止宕机导致的数据丢失:即事务提交时,先写重做日志,再修改内存数据页的方式脏数据刷新等。除此之外,还有服务重新启动。
一.checkpoint介绍
checkpoint是为了解决哪些问题呢?
对于数据需要频繁更新的场景,要实时更新,对于MySQL来说,只处理IO,就能把性能耗尽。
Redo日志大小也是有限的,通过刷新策略,可以更有效的重复使用文件,不需要开辟新的空间。
缓冲区大小有限。数据不刷到硬盘,对于查询业务,命中率越来越小。
数据库宕机,崩溃恢复期间,需要从上次的检查点进行恢复,使得效率提升。
物理备份日志点。
InnoDB引擎通过LSN(Log Sequence Number)来标记版本,LSN是日志空间中每条日志的结束点,用字节偏移量来表示。每个Page有LSN,每个Redo log有LSN,每个checkpoint也有LSN。
checkpoint会对哪些MySQL实体做操作?
Dirty page:InnoDB缓冲池中已经在内存中更新的页面,其中的更改还没有写入(刷新)到数据文件。
Flush:将已缓冲在内存区域或临时磁盘存储区域中的数据库文件的更改写入。
Redo log:数据更改信息记录文件。
二.checkpoint机制
从官方提供的说明中checkpoint分为两个:
Fuzzy checkpoint:进行部分脏页的刷新,有效循环利用Redo日志。
Sharp checkpoint:发生在关闭数据库时,将所有脏页刷回磁盘。
通过以上两个方式,在不同的情况下触发checkpoint:
1) flush_lru_list
flush_lru_list checkpoint是在单独的page cleaner线程中执行的。Buffer Pool的LRU空闲列表中保留一定数量的空闲页面,来保证Buffer Pool中有足够的空间应对新的数据库请求。
在空闲列表不足时,发生flush_lru_list checkpoint,空闲数量阈值是可以配置的。