几个知识点:
缓冲池:缓存磁盘数据,通过内存速度弥补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
     图解如下:
MySQL-checkpoint技术-LMLPHP
 
关于用户阻塞的问题:
     在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
05-12 05:34