关于checkpoint机制

2023-11-04

关于checkpoint机制

一、简介

思考一下这个场景:如果重做日志可以无限地增大,同时缓冲池也足够大,那么是不需要将缓冲池中页的新版本刷新回磁盘。因为当发生宕机时,完全可以通过重做日志来恢复整个数据库系统中的数据到宕机发生的时刻。

但是这需要两个前提条件:1、缓冲池可以缓存数据库中所有的数据;2、重做日志可以无限增大

因此Checkpoint(检查点)技术就诞生了,目的是解决以下几个问题:1、缩短数据库的恢复时间;2、缓冲池不够用时,将脏页刷新到磁盘;3、重做日志不可用时,刷新脏页。

  • 当数据库发生宕机时,数据库不需要重做所有的日志,因为Checkpoint之前的页都已经刷新回磁盘。数据库只需对Checkpoint后的重做日志进行恢复,这样就大大缩短了恢复的时间。

  • 当缓冲池不够用时,根据LRU算法会溢出最近最少使用的页,若此页为脏页,那么需要强制执行Checkpoint,将脏页也就是页的新版本刷回磁盘。

  • 当重做日志出现不可用时,因为当前事务数据库系统对重做日志的设计都是循环使用的,并不是让其无限增大的,重做日志可以被重用的部分是指这些重做日志已经不再需要,当数据库发生宕机时,数据库恢复操作不需要这部分的重做日志,因此这部分就可以被覆盖重用。如果重做日志还需要使用,那么必须强制Checkpoint,将缓冲池中的页至少刷新到当前重做日志的位置。

对于InnoDB存储引擎而言,是通过LSN(Log Sequence Number)来标记版本的。

LSN是8字节的数字,每个页有LSN,重做日志中也有LSN,Checkpoint也有LSN。可以通过命令SHOW ENGINE INNODB STATUS来观察:

1
2
3
4
5
6
7
8
9
10
mysql> show engine innodb status \G
 
---
LOG
---
Log sequence number 34778380870
Log flushed up to   34778380870
Last checkpoint at  34778380870
0 pending log writes, 0 pending chkp writes
54020151 log i /o 's done, 0.92 log i/o' s /second

Checkpoint发生的时间、条件及脏页的选择等都非常复杂。而Checkpoint所做的事情无外乎是将缓冲池中的脏页刷回到磁盘,不同之处在于每次刷新多少页到磁盘,每次从哪里取脏页,以及什么时间触发Checkpoint。

二、Checkpoint分类

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

Sharp Checkpoint 发生在数据库关闭时将所有的脏页都刷新回磁盘,这是默认的工作方式,即参数innodb_fast_shutdown=1。但是若数据库在运行时也使用Sharp Checkpoint,那么数据库的可用性就会受到很大的影响。故在InnoDB存储引擎内部使用Fuzzy Checkpoint进行页的刷新,即只刷新一部分脏页,而不是刷新所有的脏页回磁盘。

Fuzzy Checkpoint:1、Master Thread Checkpoint;2、FLUSH_LRU_LIST Checkpoint;3、Async/Sync Flush Checkpoint;4、Dirty Page too much Checkpoint

1、Master Thread Checkpoint 

以每秒或每十秒的速度从缓冲池的脏页列表中刷新一定比例的页回磁盘,这个过程是异步的,此时InnoDB存储引擎可以进行其他的操作,用户查询线程不会阻塞。

2、FLUSH_LRU_LIST Checkpoint

因为InnoDB存储引擎需要保证LRU列表中需要有差不多100个空闲页可供使用。在InnoDB1.1.x版本之前,需要检查LRU列表中是否有足够的可用空间操作发生在用户查询线程中,显然这会阻塞用户的查询操作。倘若没有100个可用空闲页,那么InnoDB存储引擎会将LRU列表尾端的页移除。如果这些页中有脏页,那么需要进行Checkpoint,而这些页是来自LRU列表的,因此称为FLUSH_LRU_LIST Checkpoint。

而从MySQL 5.6版本,也就是InnoDB1.2.x版本开始,这个检查被放在了一个单独的Page Cleaner线程中进行,并且用户可以通过参数innodb_lru_scan_depth控制LRU列表中可用页的数量,该值默认为1024,如:

1
2
3
4
5
6
mysql>  SHOW GLOBAL VARIABLES LIKE  'innodb_lru_scan_depth' ;
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_lru_scan_depth | 1024  |
+-----------------------+-------+

3、Async/Sync Flush Checkpoint

指的是重做日志文件不可用的情况,这时需要强制将一些页刷新回磁盘,而此时脏页是从脏页列表中选取的。若将已经写入到重做日志的LSN记为redo_lsn,将已经刷新回磁盘最新页的LSN记为checkpoint_lsn,则可定义:

checkpoint_age = redo_lsn - checkpoint_lsn

再定义以下的变量:

async_water_mark = 75% * total_redo_log_file_size

sync_water_mark = 90% * total_redo_log_file_size

若每个重做日志文件的大小为1GB,并且定义了两个重做日志文件,则重做日志文件的总大小为2GB。那么async_water_mark=1.5GB,sync_water_mark=1.8GB。则:

当checkpoint_age<async_water_mark时,不需要刷新任何脏页到磁盘;

当async_water_mark<checkpoint_age<sync_water_mark时触发Async Flush,从Flush列表中刷新足够的脏页回磁盘,使得刷新后满足checkpoint_age<async_water_mark;

checkpoint_age>sync_water_mark这种情况一般很少发生,除非设置的重做日志文件太小,并且在进行类似LOAD DATA的BULK INSERT操作。此时触发Sync Flush操作,从Flush列表中刷新足够的脏页回磁盘,使得刷新后满足checkpoint_age<async_water_mark。

可见,Async/Sync Flush Checkpoint是为了保证重做日志的循环使用的可用性。在InnoDB 1.2.x版本之前,Async Flush Checkpoint会阻塞发现问题的用户查询线程,而Sync Flush Checkpoint会阻塞所有的用户查询线程,并且等待脏页刷新完成。从InnoDB 1.2.x版本开始——也就是MySQL 5.6版本,这部分的刷新操作同样放入到了单独的Page Cleaner Thread中,故不会阻塞用户查询线程。

MySQL官方版本并不能查看刷新页是从Flush列表中还是从LRU列表中进行Checkpoint的,也不知道因为重做日志而产生的Async/Sync Flush的次数。但是InnoSQL版本提供了方法,可以通过命令SHOW ENGINE INNODB STATUS来观察,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mysql> show engine innodb status \G
 
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 2058485760;  in  additional pool allocated 0
Dictionary memory allocated 913470
Buffer pool size   122879
Free buffers       79668
Database pages     41957
Old database pages 15468
Modified db pages  0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 15032929, not young 0
0.00 youngs /s , 0.00 non-youngs /s
Pages  read  15075936, created 366872, written 36656423
0.00 reads /s , 0.00 creates /s , 0.90 writes /s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages  read  ahead 0.00 /s , evicted without access 0.00 /s , Random  read  ahead 0.00 /s
LRU len: 41957, unzip_LRU len: 0
I /O  sum [39]:cur[0], unzip  sum [0]:cur[0]

4、Dirty Page too much

即脏页的数量太多,导致InnoDB存储引擎强制进行Checkpoint。其目的总的来说还是为了保证缓冲池中有足够可用的页。其可由参数innodb_max_dirty_pages_pct控制:

1
2
3
4
5
6
mysql> SHOW GLOBAL VARIABLES LIKE  'innodb_max_dirty_pages_pct'  ;
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| innodb_max_dirty_pages_pct | 75    |
+----------------------------+-------+

innodb_max_dirty_pages_pct值为75表示,当缓冲池中脏页的数量占据75%时,强制进行Checkpoint,刷新一部分的脏页到磁盘。在InnoDB 1.0.x版本之前,该参数默认值为90,之后的版本都为75。

三、Checkpoint机制

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

当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.

具体的样例如下(使用show innodb status \G命令查看,Oldest modified data log没有显示):

1
2
3
4
5
6
7
LOG
---
Log sequence number 34822137537
Log flushed up to   34822137537
Last checkpoint at  34822133028
0 pending log writes, 0 pending chkp writes
54189288 log i /o 's done, 3.00 log i/o' s /second  

四、日志保护机制

mysql crash的时候,Innodb有日志刷盘机制,可以通过innodb_flush_log_at_trx_commit参数进行控制,这里说的是如何防止日志覆盖导致日志丢失

Innodb的checkpoint和redo log有哪些紧密关系?有几上名词需要解释一下:

  • Ckp age(动态移动): 最老的dirty page还没有flush到数据文件,即没有做last checkpoint的范围

  • Buf age(动态移动): modified page information没有写到log中,但已在log buffer

  • Buf async(固定点): 日志空间大小的7/8,当buf age移动到Buf async点时,强制把没有写到log中的modified page information开始写入到log中,不阻塞事务

  • Buf sync(固定点): 日志空间大小的15/16,当写入很大的,buf age移动非常快,一下子到buf sync的点,阻塞事务,强制把modified page information开始写入到log中。如果不阻塞事务,未做last checkpoint的redo log存在覆盖危险

  • Ckp async(固定点): 日志空间大小的31/32,当ckp age到达ckp async,强制做last checkpoint,不阻塞事务

  • Ckp sync(固定点):日志空间大小,当ckp age到达ckp sync,强制做last checkpoint,阻塞事务,存在redo log覆盖的危险

接下分析4种情况

  • 如果buf age在buf async和buf sync之间

  • 如果buf age在buf sync之后(当然这种情况是不存在,mysql有保护机制)

  • 如果ckp age在ckp async和ckp sync之间(这种情况是不存在)

  • 如果ckp age在ckp sync之后(这种情况是不存在)

第一种情况:

当写入量巨大时,buf age移动到buf async和buf sync之间,触发写出到log中,mysql把尽量多的log写出,如果写入量减慢,buf age又移回到“图一”状态。如果写入量大于flush log的速度,buf age最终会和buf sync重叠,这时所有的事务都被阻塞,强制将2*(Buf age-Buf async)的脏页刷盘,这时IO会比较繁忙。

第二种情况:

当然这种情况是不可能出现,因为如果出现,redo log存在覆盖的可能,数据就会丢失。buf age会越过log size,buf age的大小可能就超过log size,如果要刷buf age,那么整个log size都不够容纳所有的buf age。

第三种和第四种情况不存在分析:

ckp age始终位于buf age的后面(左边),因为ckp age是last checkpoint点,总是追赶buf age(将尽可能多的modified page flush到磁盘),所以buf age肯定是先到达到buf sync。

ckp async及ckp sync存在意义?

mysql中page cache也存在high water及low water,当dirty page触到low water时,os是开始flush dirty page到磁盘,到high water时,会阻塞一切动作,os会疯狂的flush dirty page,磁盘会很忙,存在IO Storm,

 

本文参考:

http://blog.csdn.net/yah99_wolf/article/category/539408

http://www.cnblogs.com/bamboos/p/3532150.html

http://tech.uc.cn/?p=716

http://www.mysqlperformanceblog.com/2011/04/04/innodb-flushing-theory-and-solutions/

如果您觉得本文对您的学习有所帮助,可通过支付宝(左) 或者 微信(右) 来打赏博主,增加博主的写作动力

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于checkpoint机制 的相关文章

随机推荐

  • 【Flink】yarn集群模式

    预备知识 Linux export 命令的生命周期 断开会话后 export 的环境变量不生效 支持会话级别的新增 删除和修改环境变量 用作之后的程序使用 仅仅用作此次会话期间 基于 YARN 模式部署 Flink 服务 3 1 基于 YA
  • 【SPI协议】

    一 SPI介绍 SPI是 全双工 通信 具有单独的发送和接收线 可以同时进行发送和接收 从机不主动发起访问 总是被动执行操作 SPI包含4根逻辑线 MISO 主机输入 从机输出 MOSI 主机输出 从机输入 SCLK 串行时钟信号 此信号由
  • 论文阅读:AAAI2022 Evaluating Explainable AI on a Multi-Modal Medical Imaging Task: Can Existing Algor...

    任务 explainable AI XAI 可解释性探索 主要提出两个指标 可以代替医生对事后可解释性算法进行评估 目的 多模态医学影像中存在的clinically important but technically ignored the
  • ModuleNotFoundError: No module named ‘xxx‘问题

    更换国内安装源和设置超时时间可以解决 pip install xxx default timeout 100 i https pypi tuna tsinghua edu cn simple 即可 安装源参考 超时时间参考
  • 【004】一天一道C/C++编程题

    第四题 请编写一个函数void fun char tt int pp 统计在tt字符串中 a 到 z 26个字母各自出现的次数 并依次放在pp所指数组中 例如 当输入字符串abcdefgabcdeabc后 程序的输出结果应该是 3 3 3
  • 面试题(2)

    1 J2EE是什么 2 介绍JAVA中的Collection FrameWork 包括如何写自己的数据结构 如COLLECTION中遗留类 HASHTABLE VECTOR 和现有类的区别 同步 3 Java中异常处理机制 事件机制 4 E
  • 实验7-3-8 统计字符出现次数(20 分)

    实验7 3 8 统计字符出现次数 20 分 本题要求编写程序 统计并输出某给定字符在给定字符串中出现的次数 输入格式 输入第一行给出一个以回车结束的字符串 少于80个字符 第二行输入一个字符 输出格式 在一行中输出给定字符在给定字符串中出现
  • 三位水仙花数的两种做法

    编写程序计算如下数列的值 1 2 3 4 966 其中 所有数字为整数 从1开始递增 奇数为正 偶数为负 s 0 for i in range 967
  • mybatis plus 写sql语句

    一 api public Map
  • app常见专项测试点

    常见的apk专项测试 主要有几类 主要指项目中经常用到的 1 稳定性 2 安全性 3 兼容性 4 版本升级 5 流量测试 6 实际测试总结 对整个项目团队是如何进行测试以及测试的内容 一 稳定性测试 稳定性测试是指对应用进行长时间的操作 检
  • jq+ajax提交合并表单,JQuery通过Ajax提交表单并返回结果

    如下 1 非Ajax 对应后台 2 JQuery之Ajax 在介绍使用JQuery提交表单前 我们需要首先引用jquery form js 它来自于http www malsup com jquery form 至此 我们需要引用的JS文件
  • Nice! I just got a Minecraft gift code for FREE! :D https://freeminecraftgiftcode.net

    Nice I just got a Minecraft gift code for FREE D https freeminecraftgiftcode net Nice I just got a Minecraft gift code f
  • Nodejs学习笔记 - 版本号

    npm outdated 查看过期了的包 也不能说过期 反正版本号不是最新的 就那么个意思 QWQ npm update 更新那个包 语言组织能力有点差 理解就行了 QWQ 进入正题了哇 版本号 eg 13 1 4 上边的版本号共分为3块
  • wind10 idea中 go 开发环境搭建

    下载安装包 国内的 不用翻墙 https studygolang com 官网 需翻墙 https golang org 这里使用的的是第一种https studygolang com 下载后解压到本地 目录结构 配置环境变量 path中配
  • while语句中的break和continue

    1 break介绍 include
  • 怎么彻底删除电脑上的软件_彻底删除流氓软件的两个工具!

    流氓软件 弹出广告 我想 这些应该让很多同学都苦不苦不堪言 卸载不干净 无法卸载 卸载残留 这些顽固的软件就如同牛皮癣一样 一旦粘着就很难摆脱 本文就来推荐2款软件 这两款都是经过多年使用 对比保留下来的 从此就可以对流氓软件说再见了 前言
  • android studio构建的AAB是什么

    AAB 是 Android App Bundle 的缩写 是一种由 Google 推出的 Android 应用程序发布格式 AAB 格式的应用程序包含了应用程序的所有代码和资源 但是与传统的 APK 包不同 AAB 包含了多个分割的模块 每
  • JAVA、MySql实现登录注册(网页)

    初学JAVA EE 老师留下一小作业 用JAVA实现与服务器端交互 实现登录和注册功能 初学一种专业课很多老师都会留下一种让学生实现登录和注册的作业 下面是记录的实现步骤 1 首先是账号密码输入框和按钮 登录
  • Sa-Token的Token有效期和临时有效期的区别

    各位不要再卷了 周六我在家打着游戏 群消息就一直叮叮叮 进去看了看 周六还加班干活 哎真卷 ps 在卷就没了 吐槽一下 进入正题 就周六群友提问做一下总结 群友问题 为什么 不能续期 先说一下这位群友的测试方法 token有效期 10秒 在
  • 关于checkpoint机制

    关于checkpoint机制 一 简介 思考一下这个场景 如果重做日志可以无限地增大 同时缓冲池也足够大 那么是不需要将缓冲池中页的新版本刷新回磁盘 因为当发生宕机时 完全可以通过重做日志来恢复整个数据库系统中的数据到宕机发生的时刻 但是这