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