认识 MySQL 中的 Checkpoint 技术
1,checkpoint 产生的背景
数据库在发生增删查改操作的时候, 都是先在 buffer pool 中完成的, 为了提高事物操作的效率, buffer pool 中修改之后的数据, 并没有立即写入到磁盘, 这有可能会导致内存中数据与磁盘中的数据产生不一致的情况
事物要求之一是持久性(Durability),buffer pool 与磁盘数据的不一致性的情况下发生故障, 可能会导致数据无法持久化
为了防止在内存中修改但尚未写入到磁盘的数据, 在发生故障重启数据之后产生事物未持久化的情况, 是通过日志 (redo log) 先行的方式来保证的
redo log 可以在故障重启之后实现重做, 保证了事物的持久化的特性, 但是 redo log 空间不可能无限制扩大, 对于内存中已修改但尚未提交到磁盘的数据, 也即脏页, 也需要写入磁盘
对于内存中的脏页, 什么时候, 什么情况下, 将多少脏页写入磁盘, 是由多方面因素决定的
checkpoint 的工作之一, 就是对于内存中的脏页, 在一定条件下将脏页刷新到磁盘
2,checkpoint 的分类
按照 checkpoint 刷新的方式, MySQL 中的 checkpoint 分为两种, 也即 sharp checkpoint 和 fuzzy checkpoint
sharp checkpoint: 在关闭数据库的时候, 将 buffer pool 中的脏页全部刷新到磁盘中
fuzzy checkpoint: 数据库正常运行时, 在不同的时机, 将部分脏页写入磁盘, 进刷新部分脏页到磁盘, 也是为了避免一次刷新全部的脏页造成的性能问题
3 ,checkpoint 发生的时机
checkpoint 都是将 buffer pool 中的脏页刷新到磁盘, 但是在不同的情况下, checkpoint 会被以不同的方式触发, 同时写入到磁盘的脏页的数量也不同