MySQL的checkpoint技术

checkpoint技术的核心就是把缓冲池中的脏页刷新到磁盘,保证交易数据的持久性。

当前事务型的数据库都采用了Write Ahead Log策略,也就是WAL,在事务提交时,先写重做日志,再修改页。

对于InnoDB存储引擎而言,是通过LSN(Log Sequence Number)来标记版本的。LSN是8字节的数字,单位是字节。每个页有LSN,重做日志也有LSN,checkpoint也有LSN。

InnoDB存储引擎的checkpoint有两种:

1、Sharp Checkpoingt

      通过参数innodb_fast_shutdown来控制。表示把缓冲池中的脏页100%全部刷新到磁盘上。

     

    该参数有三个值0、1、2。

    0:当MySQL关闭时,InnoDB需要完成所有的full purge和merge insert buffer,并且将所有的脏页刷新回磁盘;

    1:当MySQL关闭时,InnoDB不需要完成上述的full purge和merge insert buffer,但是缓冲池中的部分脏页会刷新回磁盘;

     2:当MySQL关闭时,InnoDB不完成上述的full purge和merge insert buffer,也不将缓冲池中的部分脏页会刷新回磁盘,但是将日志都写入日志文件;这样不会有任何事务的丢失,但是数据库下次启动的时候会进行recovery操作。

  2、Fuzzy  Checkpoint

       采用该模式只刷新部分脏页,而不是刷新所有的脏页。

InnoDB引擎,可能会发生如下几种情况的Fuzzy  Checkpoint:

1、Master Thread Checkpoint

        差不多每秒或每10秒从脏页列表中刷新一定比例的页回磁盘,这个过程是异步的,此时InnoDB引擎可以进行其他操作,用户的查询线程不会阻塞。

2、FLUSH_LRU_LIST Checkpoint

       InnoDB存储引擎需要保证LRU列表中需要有差不多100个空闲页可供使用。在InnoDB存储引擎1.1.X之前会引起查询阻塞。但是后续的版本已经做了改进,在mysql 5.6之后,这个检查放在了一个单独的page cleaner线程中进行,用户可以通过参数innodb_lru_scan_depth来控制LRU列表中可用页的数量。

 3、Async/Sync Flush Checkpoint

         是指重做日志文件不可用的情况,这时需要强制将一些页刷新回磁盘,而此时脏页是从脏页列表中选取的。

         若将依据写入重做日志的LSN标记为redo_lsn;将已经刷新回磁盘最新页的LSN标记为checkpoingt_lsn,则可定义:

         checkpoingt_age=redo_lsn - checkpoingt_lsn

         再定义变量:

         async_water_mark = total_redo_log_size * 75%

         sync_water_mark =   total_redo_log_size * 90%

         checkpoingt_age < async_water_mark的时候不需要刷新脏页到磁盘;

        async_water_mark < checkpoingt_age < sync_water_mark:触发Async Flush,从flush列表中刷新脏页直到满足checkpoingt_age < async_water_mark;

        checkpoingt_age > sync_water_mark,发生的概率很少,要么是重做日志太小;要么是有LOAD DATA或BULK INSERT操作。

        Async flush checkpoint会阻塞发现问题的用户查询线程;

        sync flush checkpoint会阻塞所有用户的查询线程;

4、Dirty Page Too much Checkpoint

       这是由于脏页太多,导致InnoDB存储引擎强制进行checkpoint。总体来说是为了保证缓冲池中有足够可用的页。

      参数innodb_max_dirty_pages_pct表示当缓冲池中脏页数据量占据百分比的时候,强制进行CKPT。

猜你喜欢

转载自blog.csdn.net/David_ifx/article/details/120928200