几个知识点:
缓冲池:缓存磁盘数据,通过内存速度弥补CPU速度和磁盘速度的鸿沟。
脏页:LRU列表中被修改的页,和磁盘上的数据不一致
刷新频率:每次有脏页就刷新,开销很大。需要一种刷新机制
数据丢失:有脏页,未刷新到磁盘,发生宕机,可能会丢失--->引入Write Ahead Log策略(先写重做日志,再修改页)
数据恢复:通过重做日志恢复数据,体现事务ACID中的持久性(D)
checkpoint:将缓冲池中的脏页刷新回到磁盘。
 
checkpoint解决的问题:
  • 缩短数据库的恢复时间
  • 缓冲池不够用,将脏页刷新回磁盘
  • 重做日志不可用(不可被重用,不可被覆盖),刷新脏页
     1.缩短数据库恢复时间重做日志中记录了的checkpoint的位置,这个点之前的页已经刷新回磁盘,只需要对checkpoint之后的重做日志进行恢复。这样就大大缩短了恢复时间。
     2.缓冲池不够用时,根据LRU算法,溢出最近最少使用的页,如果页为脏页,强制执行checkpoint,将页刷新回磁盘。
     3.重做日志不可用,是指,重做日志的这部分不可以被覆盖,为什么?因为:这部分对应的数据还未刷新到磁盘上。重做日志的设计是循环使用的。数据库恢复时,如果不需要,即可被覆盖;如果需要,必须强制执行checkpoint,将缓冲池中的页至少刷新到当前重做日志的位置。
 
 InnoDB存储引擎,通过LSN来标记版本,LSN是8字节的数字。每个页有LSN,重做日志有LSN,checkpoint有LSN。
 
----checkpoint的刷新原理------------------------------------
 
checkpoint:将缓冲池中的脏页刷回到磁盘。
考虑的问题:每次刷新多少页到磁盘?每次从哪里取脏页?什么时间触发checkpoint?
InnoDB存储引擎内部,两种checkpoint,分别为:
  • Sharp Checkpoint
  • Fuzzy Checkpoint
Sharp Checkpoint发生在数据库关闭时,将所有的脏页都刷新回磁盘,这是默认的工作方式,即参数:innodb_fast_shutdown=1。
不适用于数据库运行时的刷新。
 
在数据库运行时,InnoDB存储引擎内部采用Fuzzy Checkpoint,只刷新一部分脏页。
几种发生Fuzzy Checkpoint的情况:
     1.MasterThread Checkpoint
     异步刷新,每秒或每10秒从缓冲池脏页列表刷新一定比例的页回磁盘。异步刷新,即此时InnoDB存储引擎可以进行其他操作,用户查询线程不会受阻。-->参考master Thread的介绍
     2.FLUSH_LRU_LIST Checkpoint
     InnoDB存储引擎需要保证LRU列表中差不多有100个空闲页可供使用。在InnoDB 1.1.x版本之前,用户查询线程会检查LRU列表是否有足够的空间操作。如果没有,根据LRU算法,溢出LRU列表尾端的页,如果这些页有脏页,需要进行checkpoint。因此叫:flush_lru_list checkpoint.
     mysql5.6之后,也就是Innodb1.2.x开始,这个检查放在了单独的进程(Page Cleaner)中进行。好处:1.减少master Thread的压力 2.减轻用户线程阻塞。-->参考page cleaner线程。
         设置参数:innodb_lru_scan_dept:控制LRU列表中可用页的数量,该值默认1024 
     3.Async/Sync Flush Checkpoint
     指重做日志不可用的情况,需要强制刷新页回磁盘,此时的页时脏页列表选取的。
    这种情况是保证重做日志的可用性,说白了就是,重做日志中可以循环覆盖的部分空间太少了,换种说法,就是极短时间内产生了大量的redo log。
     写入日志的LSN:redo_lsn
     刷新回磁盘的最新页LSN:checkpoint_lsn
     定义:
          checkpoint_age = redo_lsn - checkpoint_lsn
          async_water_mark = 75% * total_redo_file_size
          sync_water_mark = 90% * total_redo_file_size
     图解如下:
 
关于用户阻塞的问题:
     在InnoDB1.2.x版本之前,Async Flush Checkpoint 会阻塞发现问题的用户查询线程;Sync Flush Checkpoint会阻塞所有用户查询线程。
     在InnoDB1.2.x版本开始,也就是MySQL5.6,这部分的刷新操作放在了单独的线程中:Page Cleaner Thread中,故不会阻塞用户查询线程。
     通过show engine innodb status\G 可以查看Async Flush,Sync Flush
     
     4.Dirty Page too much Checkpoint
     即脏页太多,强制checkpoint.保证缓冲池有足够可用的页。
     参数设置:innodb_max_dirty_pages_pct = 75 表示:当缓冲池中脏页的数量占75%时,强制checkpoint。1.0.x之后默认75
 
--OK

MySQL-checkpoint技术的更多相关文章

  1. 携程二面:讲讲 MySQL 中的 WAL 策略和 CheckPoint 技术

    前段时间我在准备暑期实习嘛,这是当时面携程的时候二面的一道问题,我一脸懵逼,赶紧道歉,不好意思不知道没了解过,面试官又解释说 redo log,我寻思着 redo log 我知道啊,WAL 是啥?给面 ...

  2. MySQL分区技术 (一)

    4:MySQL 分区技术(是mysql 5.1以版本号后開始用->是甲骨文mysql技术团队维护人员以插件形式插入到mysql里面的技术) 眼下,针对海量数据的优化主要有2中方法: 1:大表拆成 ...

  3. InnoDB体系架构(三)Checkpoint技术

    Checkpoint技术 前篇 InnoDB体系架构(二)内存 从缓冲池.缓冲池的管理.重做日志缓冲.额外内存缓冲这四个点介绍了InnoDB存储引擎的内存结构,而在将缓冲池的数据刷新到磁盘的过程中使用 ...

  4. MySQL中Checkpoint技术

    个人读书笔记,详情参考<MySQL技术内幕 Innodb存储引擎> 1,checkpoint产生的背景数据库在发生增删查改操作的时候,都是先在buffer pool中完成的,为了提高事物操 ...

  5. PHP+MySQL开发技术详解—学习笔记

    1.      PHP is Hypertext Preproocessor. 2.      Hello World: <?php Echo ‘Hello World!’; ?> 3.  ...

  6. MySQL checkpoint深入分析

    1.日常关注点的问题 2.日志点分析 3.checkpoint:脏页刷盘的检查点 4.模糊检查点发生条件 1.master thread checkpoint 2.flush_lru_list che ...

  7. 【转】mysql保存图片技术决定:保存二进制文件还是只保存图片相对路径,图片放在硬盘上面?

    最近遇到上面这个问题,一开始我就果断否决了数据库保存图片的策略,主要是太蠢!事实上我的决定是正确的,我仅仅理解为mysql读写性能提高的境界,具体为什么可以提高?很模糊,知道我看到了这里: 大佬做的实 ...

  8. 关于MySQL checkpoint

    Ⅰ.Checkpoint 1.1 checkpoint的作用 缩短数据库的恢复时间 缓冲池不够用时,将脏页刷到磁盘 重做日志不可用时,刷新脏页 1.2 展开分析 page被缓存在bp中,page在bp ...

  9. php+mysql缓存技术的实现

    本教程适合于那些对缓存SQL查询以减少数据库连接与执行的负载.提高脚本性能感兴趣的PHP程序员.概述 许多站点使用数据库作为站点数据存储的容器.数据库包含了产器信息.目录结构.文章或者留言本,有些数据 ...

  10. mysql数据库技术1——基本的增删查改的sql语句

    1.数据库语言的分类 DDL:数据库定义语言 data Definition language 用于创建.修改.和删除数据库内的数据结构,如: 1:创建和删除数据库(CREATE DATABASE | ...

随机推荐

  1. 自己动手写ORM(02):Sql生成器实现

    上一节中鄙人通过解析表达式树生成Sql碎片,其中我也把解析表达式类代码贴了出来,文章发布之后我对ExpressionAnalyzer类做了些改动,下面我还会将代码贴出来,废话不多说,直接进入今天的主题 ...

  2. C# 多线程学习(五)线程同步和冲突解决

    from:https://blog.csdn.net/codedoctor/article/details/74358257 首先先说一个线程不同步的例子吧,以下为售票员的模拟售票,多个售票员出售10 ...

  3. AVA 8 :从永久区(PermGen)到元空间(Metaspace)

    你注意到了吗?JDK 8早期可访问版本已经提供下载了,java 开发人员可以使用java 8 提供的新的语言和运行特性来做一些实验.其中一个特性就是完全的移除永久代(Permanent Generat ...

  4. 【BZOJ4592】[Shoi2015]脑洞治疗仪 线段树

    [BZOJ4592][Shoi2015]脑洞治疗仪 Description 曾经发明了自动刷题机的发明家SHTSC又公开了他的新发明:脑洞治疗仪--一种可以治疗他因为发明而日益增大的脑洞的神秘装置. ...

  5. java反射——方法

    大家都知道反射技术在Java里面时非常重要的一个技术点,因为Java好多框架的编写都是基于反射的,别的不多说,spring框架里面的IOC就是基于反射实现.那么什么是反射呢?JAVA反射机制是在运行状 ...

  6. monggodb 模糊查询

    MongoDB的模糊查询其实很简单:      11.LIKE模糊查询userName包含A字母的数据(%A%)       SQL:SELECT * FROM UserInfo WHERE user ...

  7. mysql_系统数据库认识

    show databases:查看mysql自带数据库有information_schema,mysql, performance_schema, test information_schema数据库 ...

  8. Spring使用JMS传递消息的两种方式

    方式一:同步收发消息,使用JMS template 消费者阻塞等待消息的到来. 方式二:异步收发消息,使用message listener container 消费者提供一个listener,注册一个 ...

  9. 自动适应label

    CGFloat btnH = 300; NSString *text=@"你在这是NSString的对象方法,一个字符串实例调用该方法时,方法会通过传入的参数返回一个CGRect型数据,这个 ...

  10. 3.php数据类型中NULL,"",0的比较

    <?php //赋值 $some1 = NULL; $some2 = 0; $some3 = ""; //0与NULL比较 echo $some1==$some2; echo ...