写点什么

MySQL 笔记之 Checkpoint 机制

  • 2023-07-03
    福建
  • 本文字数:1490 字

    阅读完需:约 5 分钟

CheckPoint 是 MySQL 的 WAL 和 Redolog 的一个优化技术。

一、Checkpoint 机制

CheckPoint 做了什么事情?将缓存池中的脏页刷回磁盘。

checkpoint 定期将 db buffer 的内容刷新到 data file,当遇到内存不足、db buffer 已满等情况时,需要将 db buffer 中的内容/部分内容(特别是脏数据)转储到 data file 中。

 在转储时,会记录 checkpoint 发生的位置,在故障回复时候,只需要 redo/undo 最近的一次 checkpoint 之后的操作。

 

二、CheckPoint 作用

1、缩短数据库的恢复时间

当数据库宕机时,数据库不需要重做所有日志,因为 CheckPoint 之前的页都已经刷新回磁盘。只需对 CheckPoint 后的重做日志进行恢复,从而缩短恢复时间

2、缓冲池不够用时,将脏页刷新到磁盘

当缓存池不够用时,LRU 算法会溢出最近最少使用的页,若此页为脏页,会强制执行 CheckPoint,将该脏页刷回磁盘

3、Redo 日志不可用时,刷新脏页

不可用是因为对重做日志的设计是循环使用的。重做日志可以被重用的部分,是指当数据库进行恢复操作时不需要的部分。若此时这部分重做日志还有用,将强制执行 CheckPoint,将缓冲池的页至少刷新到当前重做日志的位置

三、CheckPoint 种类

InnoDB 存储引擎内部,有两种 Checkpoint,分别为:Sharp Checkpoint、Fuzzy Checkpoint

1、Sharp CheckPoint

发生在数据库关闭时,会将所有的脏页刷回磁盘,这是默认的工作方式,即参数 innodb_fast_shutdown=1。

但是若数据库在运行时也使用 Sharp Checkpoint,那么数据库的可用性就会受到很大的影响。故在 InnoDB 存储引擎内部使用 Fuzzy Checkpoint 进行页的刷新,即只刷新一部分脏页,而不是刷新所有的脏页回磁盘。

2、Fuzzy CheckPoint

为提高性能,数据库运行时使用 Fuzzy CheckPoint 进行页的刷新,即只刷新一部分脏页。

 

Fuzzy Checkpoint(模糊检查点):

  • Master Thread Checkpoint;

  • FLUSH_LRU_LIST Checkpoint;

  • Async/Sync Flush Checkpoint;

  • Dirty Page too much Checkpoint

 

在 Innodb 事务日志中,采用了 Fuzzy Checkpoint,Innodb 每次取最老的 modified page(last checkpoint)对应的 LSN,再将此脏页的 LSN 作为 Checkpoint 点记录到日志文件,意思就是此 LSN 之前的 LSN 对应的日志和数据都已经 flush 到 redo log。

三、LSN 标记

InnoDB 引擎通过 LSN(Log Sequence Number)来标记版本,LSN 是日志空间中每条日志的结束点,用字节偏移量来表示。

1、LSN(Log Sequence Number)

  • LSN 是用来标记版本的

  • LSN 是 8 字节的数字

  • 每个 page 有 LSN,redo log 也有 LSN,Checkpoint 也有 LSN

2、Log Sequence Number

当 mysql crash 的时候,Innodb 扫描 redo log,从 last checkpoint 开始 apply redo log 到 buffer pool,直到 last checkpoint 对应的 LSN 等于 Log flushed up to 对应的 LSN,则恢复完成。



如上图所示,Innodb 的一条事务日志共经历 4 个阶段:

  • 创建阶段:事务创建一条日志

  • 日志刷盘:日志写入到磁盘上的日志文件

  • 数据刷盘:日志对应的脏页数据写入到磁盘上的数据文件

  • 写 CKP:日志被当作 Checkpoint 写入日志文件;

 

对应这 4 个阶段,系统记录了 4 个日志相关的信息,用于其它各种处理使用:

  • Log sequence number(LSN1):当前系统 LSN 最大值,新的事务日志 LSN 将在此基础上生成(LSN1+新日志的大小);

  • Log flushed up to(LSN2):当前已经写入日志文件的 LSN;

  • Oldest modified data log(LSN3):当前最旧的脏页数据对应的 LSN,写 Checkpoint 的时候直接将此 LSN 写入到日志文件;

  • Last checkpoint at(LSN4):当前已经写入 Checkpoint 的 LSN;

对于系统来说,以上 4 个 LSN 是递减的,即: LSN1>=LSN2>=LSN3>=LSN4。

  

参考资料:

https://lefred.be/content/a-graph-a-day-keeps-the-doctor-away-mysql-checkpoint-age/

来源:

https://www.cnblogs.com/binyue/p/17299558.html

发布于: 刚刚阅读数: 4
用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
MySQL笔记之Checkpoint机制_MySQL 高可用_互联网工科生_InfoQ写作社区