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/
MySQL笔记之Checkpoint机制的更多相关文章
- 【mysql】关于checkpoint机制
一.简介 思考一下这个场景:如果重做日志可以无限地增大,同时缓冲池也足够大,那么是不需要将缓冲池中页的新版本刷新回磁盘.因为当发生宕机时,完全可以通过重做日志来恢复整个数据库系统中的数据到宕机发生的时 ...
- Mysql怎么判断繁忙 checkpoint机制 innodb的主要参数
Mysql怎么判断繁忙,innodb的主要参数,checkpoint机制,show engine innodb status 2018年07月13日 15:45:36 anzhen0429 阅读数 ...
- Spark cache、checkpoint机制笔记
Spark学习笔记总结 03. Spark cache和checkpoint机制 1. RDD cache缓存 当持久化某个RDD后,每一个节点都将把计算的分片结果保存在内存中,并在对此RDD或衍生出 ...
- InnoDB存储引擎介绍-(4)Checkpoint机制二
原文链接 http://www.cnblogs.com/chenpingzhao/p/5107480.html 一.简介 思考一下这个场景:如果重做日志可以无限地增大,同时缓冲池也足够大,那么是不需要 ...
- InnoDB存储引擎介绍-(4)Checkpoint机制一
检查点的工作机制: innodb会自动维护一个检查点的机制,叫做 fuzzy checkpointing(当然sharp checkpoint也是检查点之一),fuzzy checkpointing就 ...
- MySQL笔记(2)---InnoDB存储引擎
1.前言 本节记录InnoDB的相关知识点. 2.InnoDB存储引擎简介 2.1版本 MySQL5.1开始,允许用动态方式加载引擎,这样存储引擎的更新可以不受MySQL数据库版本的限制.下面是各个I ...
- 最全mysql笔记整理
mysql笔记整理 作者:python技术人 博客:https://www.cnblogs.com/lpdeboke Windows服务 -- 启动MySQL net start mysql -- 创 ...
- Mongodb源代码阅读笔记:Journal机制
Mongodb源代码阅读笔记:Journal机制 Mongodb源代码阅读笔记:Journal机制 涉及的文件 一些说明 PREPLOGBUFFER WRITETOJOURNAL WRITETODAT ...
- MySQL笔记汇总
[目录] MySQL笔记汇总 一.mysql简介 数据简介 结构化查询语言 二.mysql命令行操作 三.数据库(表)更改 表相关 字段相关 索引相关 表引擎操作 四.数据库类型 数字型 字符串型 日 ...
- mysql笔记04 MySQL高级特性
MySQL高级特性 1. 分区表:分区表是一种粗粒度的.简易的索引策略,适用于大数据量的过滤场景.最适合的场景是,在没有合适的索引时,对几个分区进行全表扫描,或者是只有一个分区和索引是热点,而且这个分 ...
随机推荐
- tomcat8.5.55启动失败service tomcat start 报错
问题描述: Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At least one of these e ...
- ZXing 生成二维码和条形码(添加NuGet包)
- 3dmax专用卸载修复工具,一键完全彻底卸载删除3dmax软件的专用卸载工具
标题:3dmax重新安装方法经验总结,利用卸载清理工具完全彻底排查删除干净3dmax各种残留注册表和文件.3dmax显示已安装或者报错出现提示安装未完成某些产品无法安装的问题,怎么完全彻底删除清理干净 ...
- Redis 集群模式的安装与配置【源码安装redis-7.0.5】
Redis最新版下载地址:http://download.redis.io/releases/redis-7.0.5.tar.gz 步骤如下: 1)wget http://download.redis ...
- == 和 equal 的区别
== 比较的是两个对象的索引是否相同: equal 比较的是两个对象内容是否相同: int a = 1;long b = 1L;a==b? 答案是 对:因为a和b指向的索引地址相同. 再例如 Stri ...
- javascript原型,继承
//普通对象 //函数对象(有原型 prototy 的属性) //原型的应用 继承 function Amial(){ this.type = '小于' } function cat(name){ t ...
- RuntimeError: Expected object of backend CUDA but got backend CPU for argument #4 'mat1'
原因:变量没有加cuda data=data.cuda()
- Linux系列---【内存占用过高问题排查思路】
内存占用过高问题排查思路 1.使用top命令查看后台任务 按shift+M使应用按内存使用率排序,定位到第一个使用内存最高的应用,并找到对应的PID. 2.使用ps命令查看对应的pid对应哪个应用 p ...
- uni-app 小程序在iOS系统无法长按复制问题
最近在使用uni-app开发移动端应用,有客户反映微信小程序版本在使用是无法长按复制问题,在安卓系统上却是正常的. 检查了下代码,对text标签都设置了selectable属性,寻找万能的度娘还是没有 ...
- STL妙用总结(持续更新)
1. map 自带排序功能.从小到大!把一堆东西按照要排序的键放在map里可以当二叉排序树使用.插入和检索都不错