几个知识点:
缓冲池:缓存磁盘数据,通过内存速度弥补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. PANDAS 数据合并与重塑(join/merge篇)

    pandas中也常常用到的join 和merge方法 merge pandas的merge方法提供了一种类似于SQL的内存链接操作,官网文档提到它的性能会比其他开源语言的数据操作(例如R)要高效. 和 ...

  2. Mybatis 二级缓存脏读

    脏读的产生 Mybatis的二级缓存是和命名空间绑定的,所以通常情况下每一个Mapper映射文件都有自己的二级缓存,不同的mapper的二级缓存互不影响.这样的设计一不注意就会引起脏读,从而导致数据一 ...

  3. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)6.2——DSL文档

    问题: 你需要查找Android Gradle DSL的完整文档. 解决方案: 访问Gradle Tools网站,从Android开发网站下载ZIP文件. 讨论:Android开发网站首页有完整的AP ...

  4. gradle加载spring包

    import org.gradle.plugins.ide.eclipse.model.Facet apply plugin: 'java' apply plugin: 'war' apply plu ...

  5. IntelliJ IDEA 工具技巧

    IntelliJ IDEA 工具技巧 以下都是自己积累的IntelliJ IDEA 使用技巧,比较零碎,观看不便之处还望海涵,如有错误之处还望指正 自己常用,不懂的可以加群询问:244930845 S ...

  6. 巨蟒python全栈开发flask9 项目开始1

    1.项目需求分析 立项:Javis&&taisen(三个月全部,先模拟出一个玩具,硬件需要周期长一些) 想法 --- 需求分析: .通过玩具与孩子实时进行沟通 .希望玩具的知识渊博 . ...

  7. 2.sublime的配置,

    sublime配置完成后,感觉好强大..

  8. FW qunit introduction

    自动化测试软件对于开发来说是一个很重要的工具,而单元测试对于自动化测试来说是基本组成部分:软件的每一个组件或者单元可以在非人工介入的情况下,使用测试工具一遍遍的重复执行.换句话说,就是你可以写一次测试 ...

  9. 数据库字符集(AL32UTF8)和客户端字符集(2%)是不同的

    登录oracle数据库时我们会遇到这样的提示信息:“数据库字符集(AL32UTF8)和客户端字符集(2%)是不同的”. 这是由于数据库服务端和客户端的字符集不一致所造成的,服务端字符集和客户端字符集相 ...

  10. 转!java操作redis

    package sgh.main.powersite; import java.util.ArrayList; import java.util.HashMap; import java.util.I ...