检查点的工作机制:

innodb会自动维护一个检查点的机制,叫做 fuzzy checkpointing(当然sharp checkpoint也是检查点之一),fuzzy checkpointing就是将buffer pool当中的数据页信息小批量的刷新到磁盘。但是我们没有必要单批次批次的对buffer pool进行刷新,不然后影响其他正在执行的SQL进程。

在crash recovery期间,MySQL也会记录一次检查点信息到log  file当中去。它会记录数据库检查点发生之前的所有修改数据库的操作,这样数据库就会在日志文件当中查找检查点信息,然后往前读日志重新执行(前滚)。

页的修改信息一般都会被记录到buffer pool当中,稍后这些信息就会被刷新到磁盘的数据文件当中,flushing后台进程来负责处理这个事情。所谓的检查点就是记录最后一次修改写入磁盘数据文件的一个记录信息(具体的表现形式就是LSN)。

下面稍微简单的了解一下和检查点相关的MySQL的进程和机制:

fuzzy checkpointing:一个后台进程,定期刷新buffer pool当中一部分的dirty  page到磁盘当中。

sharp checkpoint:一次性将buffer pool当中的所有脏页刷新到磁盘数据文件,在MySQL重用日志文件之前发生。由于MySQL的日志文件是循环利用的,所以通常较高的负载的情况下会频繁发生。

adaptive flushing:通过引起检查点来减轻IO负担的一种算法,取代了一次刷新所有脏页,adaptive flushing每次只刷新一部分脏页落盘,这个算法会根据数据冲洗的速度和频率自动算出最优的刷新周期。

flush:将更改刷新到数据文件,也就是所谓的落盘。在INNODB的存储结构当中,定期刷新的有redo log,undo log和buffer pool等。但是flush什么时候会发生呢?一种情况是MySQL内存存储区域已经满了的时候会触动发生flush,因为新的改变发生的话就会需要新的buffer pool空间来保存信息。如果不是立即需要刷新所有的buffer pool信息到磁盘的话,一般情况下将会使用fuzzy checkpointing这个进程一点一点来处理。

看了这么多,到底检查点是如何工作的呢?下面大体的看一下:

关于INNODB  checkpoint的算法并没有太多的文档记载,因为理解起来很难,而且还要去理解很多INNODB的很多其他相关的东西才可以很好的帮助你理解checkpoint。

首先我们要知道的就是检查点分为两种,一种是sharp checkpoint, 另外一种就是 fuzzy checkpoint。

如上面介绍的,sharp checkpoint一次性将buffer pool当中的所有脏页刷新到磁盘数据文件。并且记录LSN(log sequence number )到最后一个提交的事物的位置。当然,没有提交的事物是不会被刷新到磁盘当中的。这点和sqlserver还是有点不一样的,sqlserver是会将提交和未提交的都给刷新到磁盘当中去,这样看起来就违反了预写日志的规则。恢复以后,REDO LOG就会从最后一个LSN开始,也就是检查点发生的位置。sharp checkpoint将所有的数据刷新到磁盘当中去都是基于一个时间点的,这个LSN就是所谓的检查点发生的位置。

fuzzy checkpoint就更加复杂了,它是在固定的时间点发生,除非他已经将所有的页信息刷新到了磁盘,或者是刚发生过一次sharp checkpoint,fuzzy checkpoint发生的时候会记录两次LSN,也就是检查点发生的时间和检查点结束的时间。但是呢,被刷新的页在并不一定在某一个时间点是一致的,这也就是它为什么叫fuzzy的原因。较早刷入磁盘的数据可能已经修改了,较晚刷新的数据可能会有一个比前面LSN更新更小的一个LSN。fuzzy checkpoint在某种意义上可以理解为fuzzy checkpoint从redo  log的第一个LSN执行到最后一个LSN。恢复以后的话,REDO LOG就会从最后一个检查点开始时候记录的LSN开始。

一般情况下大家可能fuzzy checkpoint的发生频率会远高于sharp checkpoint发生的频率,这个事毫无疑问的。不过当数据库关闭,切换redo 日志文件的时候是会触发sharp checkpoint,一般情况是fuzzy checkpoint发生的更多一些。

一般情况下,执行普通操作的时候将不会发生检查点的操作,但是,fuzzy checkpoint却要根据时间推进而不停的发生。刷新脏页已经成为了数据库的一个普通的日常操作。

INNODB维护了一个大的缓冲区,以保证被修改的数据不会被立即写入磁盘。她会将这些修改过的数据先保留在buffer pool当中,这样在这些数据被写入磁盘以前可能会经过多次的修改,我们称之为写结合。这些数据页在buffer pool当中都是按照list来管理的,free list会记录那些空间是可用的,LRU list记录了那些数据页是最近被访问到的。flush list则记录了在LSN顺序当中的所有的dirty page信息,最近最少修改信息。

这里着重看一下flush list,我们知道innodb的缓存空间是有限的。如果buffer pool空间使用完毕,再次读取新数据就会发生磁盘读,也就是会发生flush操作,所以说就要释放一部分没有被使用的空间来保证buffer pool的可用性。由于这样的操作是很耗时的,所以说INNODB是会连续按照时间点去执行刷新操作,这样就保证了又足够的clean page来作为交换,而不必发生flush操作。每一次刷新都会将flush list的最老的信息驱逐,这样才能够保证数据库缓冲命中率是很高的一个值。这些老数据的选取是根据他们在磁盘的位置和LSN(最后一次修改的)号来确认数据新旧。

MySQL数据的日志都是混合循环使用的,但是如果这些事物记录的页信息还没有被刷新到磁盘当中的话是绝对不会被覆盖写入的。如果还没被刷新入磁盘的数据被覆盖了日志文件,那数据库宕机的话岂不是所有被覆盖写入的事物对应的数据都要丢失了呢。因此,数据修改也是有时间限制的,因为新的事物或者正在执行的事物也是需要日志空间的。日志越大,限制就越小。而且每次fuzzy checkpoint都会将最老最不被访问的数据驱逐出去,这也保证了每次驱逐的都是最老的数据,在下次日志被覆盖写入的时候都是已经被刷盘的数据的日志信息。最后一个老的,不被访问的数据的事物的LSN就是事务日志的 low-water标记,INNODB一直想提高这个LSN的值以保证buffer pool又足够的空间刷入新的数据,同时保证了数据库事务日志文件可以被覆盖写入的时候有足够的空间使用。将事务日志设置的大一些能够降低释放日志空间的紧迫性,从而可以大大的提高性能。

当innodb刷新 dirty page落盘的时候,他会找到最老的dirty  page对应的LSN并且将其标记为low-water,然后将这些信息记录到事物日志的头部,因此,每次刷新脏页都是要从flush  list的头部进行刷新的。在推进最老的LSN的标记位置的时候,本质上就是做了一次检查点。

当INNODB宕机的时候,他还要做一些额外的操作,第一:停止所有的数据更新等操作,第二:将dirty page in  buffer 的数据刷新落盘,第三:记录最后的LSN,因为我们上面也说到了,这次发生的是sharp checkpoint,并且,这个LSN会写入到没一个数据库文件的头部,以此来标记最后发生检查点的时候的LSN位置。

我们知道,刷新脏页数据的频率如果越高的话就代表整个数据库的负载很大,越小当然代表数据库的压力会小一点。将LOG 文件设置的很大能够再检查点发生期间减少磁盘的IO,总大小最好能够设置为和buffer pool大小相同,当然如果日志文件设置太大的话MySQL就会再crash recovery的时候花费更多的时间(5.5之前)。

InnoDB Checkpoints的更多相关文章

  1. 14.10.3 InnoDB Checkpoints InnoDB 检查点:

    14.10.3 InnoDB Checkpoints InnoDB 检查点: 你的log files 变的很大可能会降低磁盘性能在checkpointing的时候, 它通常设置设置log files总 ...

  2. 14.10.1 InnoDB Disk I/O

    14.10 InnoDB Disk IO and File Space Management InnoDB 磁盘IO和文件空间管理: 14.10.1 InnoDB Disk I/O 14.10.2 F ...

  3. show engine innodb status 输出结果解读

    show engine innodb status 输出结果解读 基于MySQL 5.7.32 最近想整理一下show engine innodb status的解读,但是发现中文互联网上相关的信息要 ...

  4. [原创]InnoDB体系结构

    参阅:<innodb存储引擎内幕> innodb整体的体系结构如下图所示:  整体结构分两大部分:内存和进程其中内存包括:buffer_pool\redo log buffer\addit ...

  5. MySQL 5.6 Reference Manual-14.7 InnoDB Table Compression

    14.7 InnoDB Table Compression 14.7.1 Overview of Table Compression 14.7.2 Enabling Compression for a ...

  6. MySQL 5.6 Reference Manual-14.4 InnoDB Configuration

    14.4 InnoDB Configuration 14.4.1 InnoDB Initialization and Startup Configuration 14.4.2 Configuring ...

  7. MySQL数据库和InnoDB存储引擎文件

    参数文件 当MySQL示例启动时,数据库会先去读一个配置参数文件,用来寻找数据库的各种文件所在位置以及指定某些初始化参数,这些参数通常定义了某种内存结构有多大等.在默认情况下,MySQL实例会按照一定 ...

  8. InnoDB关键特性学习笔记

    插入缓存 Insert Buffer Insert Buffer是InnoDB存储引擎关键特性中最令人激动与兴奋的一个功能.不过这个名字可能会让人认为插入缓冲是缓冲池中的一个组成部分.其实不然,Inn ...

  9. InnoDB体系结构学习笔记

    后台线程 Master Thread 核心的后台线程,主要负责将缓冲池的数据异步刷新到磁盘,保证数据的一致性,包括(脏页的刷新).合并插入缓冲.(UNDO页的回收)等 IO Thread 4个writ ...

随机推荐

  1. VS2010 AppCode文件夹问题

    在Web应用程序中不能通过右键项目-〉”添加“-〉”添加ASP.NET文件夹“方式添加 .因为Web应用程序中App_Code就不存在 .不过可以通过手动的方式创建,添加一个文件夹命名为App_Cod ...

  2. MySql自增长列

    1. 关键字 auto_increment 2. 自增用法 a) create table test(tid int auto_increment, tname varchar(10), primar ...

  3. 缓存AsimpleCache -- 解决Android中Sharedpreferences无法存储List数据/ASimpleCache

    Sharedpreferences想必大家在项目中都经常会用到,但是如果需要在本地需要存储比较多的数据,存储一个集合的时,发现Sharedpreferences并不 是那么好使了. 分析 如果需要在本 ...

  4. HDFS snapshot操作实战

    Hadoop从2.1.0版开始提供了HDFS SnapShot的功能.一个snapshot(快照)是一个全部文件系统.或者某个目录在某一时刻的镜像.快照在下面场景下是非常有用:防止用户的错误操作:管理 ...

  5. Parallel类实现并行计算

    https://msdn.microsoft.com/zh-cn/ff652648.aspx 图像处理——并行计算的应用实例 http://blog.csdn.net/bitfan/article/d ...

  6. (String). Word Pattern

    Given a pattern and a string str, find if str follows the same pattern. Here follow means a full mat ...

  7. C++ 队列的实现

    /************************************************************************/ /* 实现一个通用同步队列 使用链表实现队列 (先 ...

  8. 数据库使用--MySQL: InnoDB 还是 MyISAM?

    MyISAM存储引擎 MyISAM是 默认存储引擎.它基于更老的ISAM代码,但有很多有用的扩展.MyISAM存储引擎的一些特征: ·      所有数据值先存储低字节.这使得数据机和操作系统分离.二 ...

  9. 配置SSH框架的心得

    开发工具为myeclipse,开发工具自带struts2,hibernate,spring框架的导入.在新建的项目上右击Myeclipse->Project Facets->Install ...

  10. IOS 解析crashlog

    1.需要log.crash. dSYM和xcode自带的symbolicatecrash 放到一个文件夹下面 2.终端cd 到文件夹下面 运行命令 export DEVELOPER_DIR=/Appl ...