个人读书笔记,详情参考《MySQL技术内幕 Innodb存储引擎》

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<sync_water_mark的时候,无需执行Flush checkpoint。也就说,redo log剩余空间超过25%的时候,无需执行Async/Sync Flush checkpoint。
  2)当async_water_mark<checkpoint_age<sync_water_mark的时候,执行Async Flush checkpoint,也就说,redo log剩余空间不足25%,但是大于10%的时候,执行Async Flush checkpoint,刷新到满足条件1
  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)的目的。

转载于:https://www.cnblogs.com/wy123/p/8353245.html

MySQL中Checkpoint技术相关推荐

  1. 讲讲 MySQL 中的 WAL 策略和 CheckPoint 技术

    本文讲讲 MySQL 中的 WAL 策略和 CheckPoint 技术 文章目录 InnoDB 体系架构 内存池 后台线程 redo log 与 WAL 策略 CheckPoint 技术 有了 bin ...

  2. checkpoint技术mysql_认识MySQL中的Checkpoint技术

    1,checkpoint产生的背景 数据库在发生增删查改操作的时候,都是先在buffer pool中完成的,为了提高事物操作的效率,buffer pool中修改之后的数据,并没有立即写入到磁盘,这有可 ...

  3. sae mysql django_Django中MySQL读写分离技术

    最近需要用到Django的MySQL读写分离技术,查了一些资料,把方法整理了下来. 在Django里实现对MySQL的读写分离,实际上就是将不同的读写请求按一定的规则路由到不同的数据库上(可以是不同类 ...

  4. exit在mysql中的意思_数据库exit是什么意思技术分享

    ORACLE的SQL命令中EXIT与QUIT有什么区别? 在oracle与数据库中,exit与disc的区别? 在韩顺平的oracle教程里看到的: disc是disconnect的缩写,该命令断开和 ...

  5. mysql information schema_[MySql技术]MySQL中information_schema是什么

    大家在安装或使用MYSQL时,会发现除了自己安装的数据库以外,还有一个information_schema数据库. information_schema数据库是做什么用的呢,使用WordPress博客 ...

  6. bcp 不能调用where 子句_技术分享 || Mysql中IS NULL、IS NOT NULL不能走索引?

    mysql中IS NULL.IS NOT NULL不能走索引? 不知道是啥原因也不知道啥时候, 江湖上流传着这么一个说法 mysql查询条件包含IS NULL.IS NOT NULL.!=.like ...

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

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

  8. MySQL中你必须知道的10件事,1.5万字!

    攻击性不大,侮辱性极强 1.SQL语句执行流程 MySQL大体上可分为Server层和存储引擎层两部分. Server层: 连接器:TCP握手后服务器来验证登陆用户身份,A用户创建连接后,管理员对A用 ...

  9. MySQL中的备份和恢复

    如何用mysql 命令进行备份和恢复?以test 库为例,创建一个备份,并再用此备份 进行恢复. mysqldump -u root -p test > test.sql mysql -u ro ...

最新文章

  1. 大龄码农经验那么丰富,为什么很多公司都不招?
  2. 手动配置Hibernate的方法
  3. 支持向量机ModuleNotFoundError: No module named ‘sklearn.datasets.samples_generator‘
  4. 将Python源码编译成pyc和pyo文件
  5. css平台HTDC币,是否应该从最新的设置中应用CSS规则?
  6. pycharm加速安装python包的速度
  7. 定制Ocelot来满足需求
  8. 微信第三方登陆,无需注册一键登录,获取用户信息,PHP实现方法
  9. 严蔚敏数据结构习题第七章
  10. mysql驱动包放在ecplise哪里_eclipse导入mysql jdbc驱动包的具体步骤及注意事项
  11. C语言基础练习-输入球体半径,计算球体表面积和体积
  12. 嵌入式使用Zbar解析二维码
  13. 使用table标签制作常用的html表格
  14. poi 修改标题字体,单独修改标题字体样式
  15. java给朋友发微信_微信api接口,给微信好友收发消息
  16. 利用 sqlplus spool 实现oracle 导出 csv 文件
  17. 【NetWorkX实例(4)】Football数据集
  18. 中关村软件园与百度飞桨启动AI人才培养计划:AI发展,人才先行
  19. 中国化合物半导体产业竞争趋势与投资前景建议报告2022-2028年版
  20. php iframe 自适应高度,两个iframe自适应高度的解决方法

热门文章

  1. es6标准入门第3版pdf_最详细,快速入门Web前端开发的正确姿势
  2. python爬虫定时运行_python 每天如何定时启动爬虫任务
  3. 1用switch语句从控制台输入100以内的分数判断优秀,良好,及格不及格属于哪一个区间
  4. JSON.toJSONString 首字母不小写
  5. WebSocket使用sendObject(Object arg0)向页面方法发送对象
  6. java将Object对象转换成实体类对象
  7. 解决Linux上解压tar.gz文件报错 (gzip: stdin: not in gzip format)
  8. C#初学者们,请离代码生成器远点!!!
  9. 青云QingCloud携手伟仕佳杰打造专业企业级云服务
  10. Node.js使用supervisor遭遇‘supervisor’不是内部或外部命令,如果解决?