事务数据库系统普遍采用Write Ahead Log策略,即当事务提交时,先写重做日志,再修改页。
当由于宕机导致数据丢失时,通过重做日志完成数据的恢复。
Checkpoint技术
检查点技术是为了解决以下几个问题:
- 缩短数据库的恢复时间:数据库宕机时只需要对Checkpoint之后的重做日志进行恢复。
- 缓冲池不够用时,将脏页刷新到磁盘:缓冲池不够用时,根据LRU算法溢出最近最少使用的页,如果此页为脏页,需要强制执行Checkpoint,将脏页刷回磁盘。
- 重做日志不可用时,刷新脏页:数据库宕机时使用重做日志恢复数据库,被重用的部分不再需要,可以被覆盖重用。若此时重做日志还需要使用,必须强制产生Checkpoint,将缓冲池中的页刷回磁盘。
两种Checkpoint方式
Sharp Checkpoint
发生在关闭数据库时将所有的脏页刷回磁盘,是默认的工作方式。
Fuzzy Checkpoint
只刷新一部分脏页。
几种情况:
- Master Thread Checkpoint
Master Thread异步的从缓冲池脏页列表中刷新一定比例的页到磁盘。 - FLUSH_LRU_LIST Checkpoint
InnoDB存储引擎需要不保证LRU列表有差不多100个空闲页可供使用,如果不够,会将LRU列表尾端的页移除。如果这些页有脏页,那么需要进行Checkpoint. - Async/Sync Flush Checkpoint
重做日志不可用,需要强制将一些页刷新回磁盘,此时脏页是从脏页列表中取的。 - Dirty Page too much Checkpoint
脏页数量太多,导致InnoDB存储引擎强制进行Checkpoint,为了保证缓冲池中有足够可用的页。