1,checkpoint产生的背景

数据库在发生增删查改操作的时候,都是先在buffer pool中完成的,为了提高事物操作的效率,buffer pool中修改之后的数据,并没有立即写入到磁盘,这有可能会导致内存中数据与磁盘中的数据产生不一致的情况。

事物要求之一是持久性(Durability),buffer pool与磁盘数据的不一致性的情况下发生故障,可能会导致数据无法持久化。

为了防止在内存中修改但尚未写入到磁盘的数据,在发生故障重启数据之后产生事物未持久化的情况,是通过日志(redo log)先行的方式来保证的。

redo log可以在故障重启之后实现“重做”,保证了事物的持久化的特性,但是redo log空间不可能无限制扩大,对于内存中已修改但尚未提交到磁盘的数据,也即脏页,也需要写入磁盘。

对于内存中的脏页,什么时候,什么情况下,将多少脏页写入磁盘,是由多方面因素决定的。

checkpoint的工作之一,就是对于内存中的脏页,在一定条件下将脏页刷新到磁盘。

2,checkpoint的分类

按照checkpoint刷新的方式,MySQL中的checkpoint分为两种,也即sharp checkpoint和fuzzy checkpoint。

sharp checkpoint:在关闭数据库的时候,将buffer pool中的脏页全部刷新到磁盘中。

fuzzy checkpoint:数据库正常运行时,在不同的时机,将部分脏页写入磁盘,进刷新部分脏页到磁盘,也是为了避免一次刷新全部的脏页造成的性能问题。

3 ,checkpoint发生的时机

checkpoint都是将buffer pool中的脏页刷新到磁盘,但是在不同的情况下,checkpoint会被以不同的方式触发,同时写入到磁盘的脏页的数量也不同。

3.1, Master Thread checkpoint

在Master Thread中,会以每秒或者每10秒一次的频率,将部分脏页从内存中刷新到磁盘,这个过程是异步的。正常的用户线程对数据的操作不会被阻塞。

3.2 ,FLUSH_LRU_LIST checkpoint

FLUSH_LRU_LIST checkpoint是在单独的page cleaner线程中执行的。

MySQL对缓存的管理是通过buffer pool中的LRU列表实现的,LRU 空闲列表中要保留一定数量的空闲页面,来保证buffer pool中有足够的空闲页面来相应外界对数据库的请求。

当这个空间页面数量不足的时候,发生FLUSH_LRU_LIST checkpoint。

空闲页的数量由innodb_lru_scan_depth参数表来控制的,因此在空闲列表页面数量少于配置的值的时候,会发生checkpoint,剔除部分LRU列表尾端的页面。

3.3 ,Async/Sync Flush checkpoint

Async/Sync Flush checkpoint是在单独的page cleaner线程中执行的。

Async/Sync Flush checkpoint 发生在重做日志不可用的时候,将buffer pool中的一部分脏页刷新到磁盘中,在脏页写入磁盘之后,事物对应的重做日志也就可以释放了。

关于redo_log文件的的大小,可以通过innodb_log_file_size来配置。

对于是执行Async Flush checkpoint还是Sync Flush checkpoint,由checkpoint_age以及async_water_mark和sync_water_mark来决定。

定义:

checkpoint_age = redo_lsn-checkpoint_lsn,也即checkpoint_age等于最新的lsn减去已经刷新到磁盘的lsn的值

async_water_mark   = 75%*innodb_log_file_size

sync_water_mark    =  90%*innodb_log_file_size

1)当checkpoint_age

2)当async_water_mark

3)当checkpoint_age>sync_water_mark的时候,执行sync Flush checkpoint。也就说,redo log剩余空间不足10%的时候,执行Sync Flush checkpoint,刷新到满足条件1。

在mysql 5.6之后,不管是Async Flush checkpoint还是Sync Flush checkpoint,都不会阻塞用户的查询进程。

个人认为:

由于磁盘是一种相对较慢的存储设备,内存与磁盘的交互是一个相对较慢的过程

由于innodb_log_file_size定义的是一个相对较大的值,正常情况下,由前面两种checkpoint刷新脏页到磁盘,在前面两种checkpoint刷新脏页到磁盘之后,脏页对应的redo log空间随即释放,一般不会发生Async/Sync Flush checkpoint。同时也要意识到,为了避免频繁低发生Async/Sync Flush checkpoint,也应该将innodb_log_file_size配置的相对较大一些。

3.4, Dirty Page too much Checkpoint

Dirty Page too much Checkpoint是在Master Thread 线程中每秒一次的频率实现的。

Dirty Page too much 意味着buffer pool中的脏页过多,执行checkpoint脏页刷入磁盘,保证buffer pool中有足够的可用页面。

Dirty Page 由innodb_max_dirty_pages_pct配置,innodb_max_dirty_pages_pct的默认值在innodb 1.0之前是90%,之后是75%。

总结:

MySQL数据库(当然其他关系数据也有类似的机制),为了提高事物操作的效率,在事物提交之后并不会立即将修改后的数据写入磁盘,而是通过日志先行(write log ahead)的方式保证事物的持久性。

对于将事物修改的数据页面,也即脏页,通过异步的方式刷新到磁盘中,checkpoint正是实现这种异步刷新脏页到磁盘的实施者。

不同的情况下,会发生不同的checkpoint,将不同数量的脏页刷新到磁盘,从而到达管理内存(第1,2,4种checkpoint)和redo log可用空间(第3种checkpoint)的目的。

checkpoint技术mysql_认识MySQL中的Checkpoint技术相关推荐

  1. 读《环境光遮蔽技术在图形图像中若干关键技术的研究》总结-其一

    末尾附文章引用 文章架构: 开篇先写Abstract,对本文章的研究内容进行了总结性概述: Abstract怎么写? 1.点名研究内容,研究意义,提出当下需要解决的问题. 2.讲本文章解决这些问题的思 ...

  2. 检查点 机制mysql_【mysql】关于checkpoint机制

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

  3. 日期加星期存入mysql_在MySQL中添加两个星期的日期?

    要在MySQL中添加两个星期的日期,请使用DATE_ADD()-insert into yourTableName(yourColumnName) values(date_add(now(),inte ...

  4. buffer pool mysql_理解Mysql中的Buffer pool

    Buffer Pool在数据库里的地位 1.回顾一下Buffer Pool是个什么东西? 数据库中的Buffer Pool是个什么东西?其实他是一个非常关键的组件,数据库中的数据实际上最终都是要存放在 ...

  5. mysql5.1 emoji_技术|如何在 MySQL 中存储 emoji ?

    问题还原 使用 erlang 存储一些特殊字符串到 MySQL 的时候,却没法读出来.经检查,这些字符串的二进制格式如下: <<240,159,152,134,240,159,152,14 ...

  6. rank()函数 mysql_在MySQL中实现Rank高级排名函数

    在MySQL中实现Rank高级排名函数 MySQL中没有Rank排名函数,当我们需要查询排名时,只能使用MySQL数据库中的基本查询语句来查询普通排名.尽管如此,可不要小瞧基础而简单的查询语句,我们可 ...

  7. 计算机科学与技术项目,工程建设项目中计算机科学与技术的应用

    近些年来,科学技术不断地提高,其发展也促进了计算机科学与技术的飞速前进,与此同时,它的使用范围也越来越广泛.计算机科学与技术在工程建设项目中的应用,可以让工程建设有一个飞跃性的革新.不仅是可以改善人工 ...

  8. 美团技术 mysql_美团MySQL数据库巡检系统的设计与应用

    巡检工作是保障系统平稳有效运行必不可少的一个环节,目的是能及时发现系统中存在的隐患.我们生活中也随处可见各种巡检,比如电力巡检.消防检查等,正是这些巡检工作,我们才能在稳定的环境下进行工作.生活.巡检 ...

  9. avg最多用多少列 mysql_使用MySQL中的AVG函数求平均值的教程

    MySQL的AVG函数是用来求出各种记录中的字段的平均值. 要了解AVG功能考虑EMPLOYEE_TBL表具有以下记录: mysql> SELECT * FROM employee_tbl; + ...

最新文章

  1. a标签是什么意思 怎么使用?
  2. pipfile和pipfile.lock、virtualenv、pipenv、pip
  3. server 2008 配置php mysql_Win2008 Server配置PHP环境
  4. 技术人员究竟应该如何保持快速学习的能力?
  5. 计算机屏幕偏白,电脑屏幕显示泛白怎么修正
  6. FreeBSD重新加载rc.conf
  7. CentOS7 添加端口
  8. 安装教程之maven下载及安装
  9. 干货丨如何从零构建一个数据可视化项目?
  10. 安装SqlServer 2016 2017 时,提示需要安装oracle JRE7 更新 51(64位)或更高版本
  11. python实现爬取12306所有站点及其编码信息(附源代码)!
  12. unity3d射击类demo
  13. linux 使用icc运行tcl,ICC的步骤流程方法
  14. Ubuntu 14.04 配置 Java SE jdk-7u55
  15. layui自定义验证表单
  16. Tomcat核心原理学习总结(二)
  17. 人力资源2017年的八大趋势
  18. http://39.98.219.132 题库标准答案(题库序号:179)之判断素数
  19. Websocket 技术实践 实现在线聊天系统
  20. 基于XMPP的IOS聊天客户端程序(IOS端一)

热门文章

  1. python整数类型-python基础数据类型一(整数类型和布尔值)
  2. 开课吧python学费-开课吧成为CNCC中国计算机大会唯一教育合作伙伴
  3. python哪本好-Python入门看哪本书好? 这里有答案
  4. python真的那么火吗-Python语言为什么这么火?
  5. python可以自学吗-大家觉得自学python多久能学会?
  6. python自学攻略-Python自学攻略
  7. winpython使用教程-如何使用Python自动控制windows桌面
  8. anaconda怎么查看python版本-anaconda如何查看并管理python环境
  9. python编程基础教程-史上最全Python编程基础入门教程
  10. 零基础python入门书籍-浅谈零基础自学python入门书