MySQL-InnoDB CheckPoint技术


作者:刘仁鹏
参考资料:《MySQL技术内幕:InnoDB存储引擎》


1.Write Ahead Log策略

  • Write-Ahead Log (WAL 预写式日志):对数据文件的修改(它们是表和索引的载体)必须是只能发生在这些修改已经记录了日志之后,也就是说,在描述这些变化的日志记录冲刷到永久存储器之后
  • 这是事务ACID中D(Durability持久性)的要求

2.CheckPoint的目的

1.缩短数据库的恢复时间

  • 当数据库宕机时,数据库不需要重做所有日志,因为CheckPoint之前的页都已经刷新回磁盘。只需对CheckPoint后的重做日志进行恢复,从而缩短恢复时间

2.缓冲池不够用时,将脏页刷新到磁盘

  • 当缓存池不够用时,LRU算法会溢出最近最少使用的页,若此页为脏页,会强制执行CheckPoint,将该脏页刷回磁盘

3.重做日志不可用时,刷新脏页

  • 不可用是因为对重做日志的设计是循环使用的。重做日志可以被重用的部分,是指当数据库进行恢复操作时不需要的部分。若此时这部分重做日志还有用,将强制执行CheckPoint,将缓冲池的页至少刷新到当前重做日志的位置

3.CheckPoint做的事

  • 将缓存池中的脏页刷回磁盘

4.LSN(Log Sequence Number)

  • LSN是用来标记版本
  • LSN是8字节的数字
  • 每个页有LSN,重做日志也有LSN,CheckPoint也有LSN

5.CheckPoint的种类

1.Sharp CheckPoint

  • 发生在数据库关闭时,会将所有的脏页刷回磁盘

2.Fuzzy CheckPoint

  • 为提高性能,数据库运行时使用Fuzzy CheckPoint进行页的刷新,即只刷新一部分脏页
  • Fuzzy CheckPoint的种类:
  1. Master Thread CheckPoint
  • 差不多以每秒或每十秒的速度,从缓存池脏页列表中刷新一定比例的页,且此过程是异步的,因此不会阻塞其他操作
  1. FLUSH_LRU_LIST CheckPoint
  • 因为InnoDB需要保证LRU列表中有一定数量的空闲页可使用,倘若不满足该条件,则会将LRU列表尾端的页移除,若这些页中有脏页,则会进行CheckPoint
  • 该检查被放在一个单独的Page Cleaner线程中进行
  • 用户可以通过innodb_lru_scan_depth控制LRU列表的可用页数量,默认为1024
  1. Async/Sync Flush CheckPoint
  • 重做日志文件不可用的情况下,会强制将一些页刷回磁盘
  • Async/Sync Flush CheckPoint是为了重做日志的循环使用的可用性
  • 简单来说,Async发生在要刷回磁盘的脏页较少的情况下,Sync发生在要刷回磁盘的脏页很多时。具体公式略过
  • 这部分操作放入到了Page Cleaner线程中执行,不会阻塞用户操作
  1. Dirty Page too much CheckPoint
  • 是指当脏页比例太多,会导致InnoDB存储引擎强制执行CheckPoint
  • 目的根本上还是为了保证缓冲池中有足够可用的页
  • 比例可由参数innodb_max_dirty_pages_pct控制。若该值为75,表示当缓冲池中脏页占据75%时,强制CheckPoint

你可能感兴趣的:(MySQL-InnoDB CheckPoint技术)