首页 > 数据库 >MySQL笔记之Checkpoint机制

MySQL笔记之Checkpoint机制

时间:2023-04-08 23:36:53浏览次数:67  
标签:CheckPoint LSN 笔记 Checkpoint MySQL 日志 脏页 checkpoint

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/

标签:CheckPoint,LSN,笔记,Checkpoint,MySQL,日志,脏页,checkpoint
From: https://www.cnblogs.com/binyue/p/17299558.html

相关文章

  • Unity框架:JKFrame2.0学习笔记(二)——Singleton单例模式
    Singleton单例模式的基类,不用mono的类可以直接继承源码namespaceJKFrame{///<summary>///单例模式的基类///</summary>publicabstractclassSingleton<T>whereT:Singleton<T>,new(){privatestaticTinstance;public......
  • Typora入门笔记-2023-04-08
    Typora入门笔记-2023.4.081-6个#号代表标题的大小,井号越多标题越小字体holleworld!hello,worldHELLO,WORLDHELLO,WORLD引用选择狂神说Java,走向人生巅峰选择狂神说Java,走向人生巅峰选择狂神说Java,走向人生巅峰图片超链接点击跳转到狂神博客列表ABCAB......
  • Vins-Mono 阅读笔记——estimator
    vins_estimator概述基本上VINS里面绝大部分功能都在这个package下面,包括IMU数据的处理(前端),初始化(我觉得可能属于是前端),滑动窗口(后端),非线性优化(后端),关键帧的选取(部分内容)(前端)。我第一次看的时候,总是抱有一个疑问,就是为什么把这么多内容全都放在这一个node里面。为了......
  • Vins-Mono 阅读笔记——前端
    1、前端流程概述VINS-Mono的前端整个封装成了一个ROS节点其订阅的topic是:相机或者数据集发来的图片其发布topic是:由pub_img发布的"feature",发布的是当前帧的特征点,特征点分装成了sensor_msgs::PointCloudPtr类型,里面包括了每个特征点的(1)归一化平面上的坐标(2)归一化平面上的......
  • Django笔记十九之manager用法介绍
    本文首发于微信公众号:Hunter后端原文链接:Django笔记十九之manager用法介绍首先介绍一下manager的使用场景,比如我们有一些表级别的,需要重复使用的功能,都可以使用manager来实现。比如我们在前面的笔记中介绍的model的create()、update()等方法,Blog.objects.create()中......
  • 10.大牛是怎么思考设计MySQL优化方案的?
    https://www.cnblogs.com/keme/p/10300154.htmlhttps://www.cnblogs.com/keme/p/10472283.html ......
  • go操作mysql
    数据库连接:使用database/sql包时必须注入(至少)一个数据库驱动。gogetgithub.com/go-sql-driver/mysql 导入包:import("database/sql"_"github.com/go-sql-driver/mysql") 通过Init函数连接数据库db,dbErr=sql.Open("mysql","root:root123456@tcp(127.0.0......
  • CS231N assignment 1 _ softmax 学习笔记 & 解析
    [注意:考虑到这个和SVM重复很多,所以会一笔带过/省略一些]softmax和SVM只是线性分类器分类结果的评判不同,完全依靠打分最大来评判结果,误差就是希望结果尽可能接近正确分类值远大于其他值.我们将打分结果按照指数权重正则化为和为1的向量:而这个值希望尽可能接近1,也就是-l......
  • 【MySQL】MySQL基础07— SQL学习 — DQL — 分组查询(转载请注明出处)
    SQL学习—DQL—分组查询5.分组查询背景:在分组函数的内容中,我们提及和分组函数一起查询的字段会有限制,产生错误。因为分组函数是将所以的参数统计成一个结果,而查询的字段是返回符合条件的个数,那么就会出错。所以引入了分组查询,将表中的相同的内容切分成数块,然后分别进行统......
  • Python ORM Pony MySQL数据库 常用操作
    Pony是一个高级的对象关系映射器ORM框架。Pony它能够使用Python生成器表达式和lambdas向数据库编写查询。Pony分析表达式的抽象语法树,并将其转换为SQL查询。支持SQLite,MySQL,PostgreSQL和Oracle等数据库,本文主要介绍PythonORMPony中MySQL数据库常用操作,及数据增加、删除、修......