mysql 原理 ~ checkpoint

一 简介:今天咱们来聊聊checkpoint

二 定义:

    checkpoin是重做日志对数据页刷新到磁盘的操作做的检查点,通过LSN号保存记录,作用是当发生宕机等crash情况时,再次启动时会查询checkpoint点,在该检查点之后发生的事物修改恢复到磁盘。

三 

    InnoDB存储引擎内部,两种checkpoint,分别为:
  • Sharp Checkpoint  适用于数据库关闭时的一致性刷新 (数据库关闭时 触发)
  • Fuzzy Checkpoint  适用于数据库运行时的部分页刷新 (数据库运行时周期性触发

四 常规Fuzzy Checkpoint

     1 master周期性操作

       mysql的master线程会进行周期性ckpt动作,大概10S一次

     2 缓冲池不够用或者触发脏页百分比机制,将脏页刷新回磁盘

    缓冲池不够用时,根据LRU算法,溢出最近最少使用的页,如果页为脏页,强制执行checkpoint,将页刷新回磁盘,达到脏页比时候,也会自动触发.

     3 重做日志不可用(不可被重用,不可被覆盖),刷新脏页

    重做日志不可用,是指,重做日志的这部分不可以被覆盖,为什么?因为:这部分对应的数据还未刷新到磁盘上。重做日志的设计是循环使用的。数据库恢复时,如果不需要,即可被覆盖;如果需要,必须强制执行checkpoint,将缓冲池中的页至少刷新到当前重做日志的位置

五 数据库关闭方式 Sharp Checkpoint

 在关闭时,参数innodb_fast_shutdown影响着表的存储引擎为InnoDB的行为。该参数可取值为0、1、2。

  1. 0代表当MySQL关闭时,InnoDB需要完成所有的full purge和merge insert buffer操作,这会需要一些时间,有时甚至需要几个小时来完成。如果在做InnoDB plugin升级,通常需要将这个参数调为0,然后再关闭数据库。
  2. 1是该参数的默认值,表示不需要完成上述的full purge和merge insert buffer操作,但是在缓冲池的一些数据脏页还是会刷新到磁盘。
  3. 2表示不完成full purge和merge insert buffer操作,也不将缓冲池中的数据脏页写回磁盘,而是将日志都写入日志文件。这样不会有任何事务会丢失,但是MySQL数据库下次启动时,会执行恢复操作(recovery)

 可以发现,设置shutdown级别也会影响着checkpoint的操作,比如Sharp Checkpoint 不会在=2的情况下触发

六  监控参数

     通过show engine innodb status 进行观测

     async flush   sync flush (这两个代表当redo不可用时,发生的checkpoint次数)   LRU list flush(这代表当LRU内部缺少空闲页时发生的checkpoint次数)  Flush list Flust(这代表脏页太多发生的checkpoint次数 通常这个是主要输出值,我感觉也包括周期性的mater thread工作)

七 总结

     在数据库运行期间触发checkpoint基本上就是以上四种

原文地址:https://www.cnblogs.com/danhuangpai/p/8341395.html