CheckPoint技术
数据库每次更新数据的时候都要将脏页刷新会磁盘,同时在事务提交中要先写重做日志,再修改页;在以上过程中发生宕机的,数据如何恢复,脏页刷新到哪里,为了解决这些问题,提出了checkPoint技术。
- 当数据库宕机的时候,数据库不需要重做左右日志,因为CheckPoint之前的页都已经刷新回磁盘,故数据库只需要对checkPoint之后的重做日志进行恢复,这样大大缩短了数据库恢复时间。
- 当缓冲池不够用的时候,根据LRU算法会溢出最近最少使用的页,若这些页为脏页,那么需要执行CheckPoint,将脏页刷新回磁盘。
- 重做日志不可用的时候,选择Flush列表中的脏页刷新回磁盘。
Master Thread 工作模式
Master Thread具有最高的线程优先级别。内部由多个循环组成:主循环(loop)、后台循环(backgroup loop)、刷新循环(flush loop)、暂停循环(suspend loop)。Master Thread会根据数据库的运行状态在四种循环中切换状态。
1.0版本之前
每秒操作:
- 日志缓冲刷新到磁盘,即使这个事务还没提交(总是)
- 合并插入缓冲(可能)
- 至多刷新100个InnoDB的缓冲池中的脏页到磁盘(可能)
- 如果没有当前用户活动,则切换到backgroup loop(可能)
每10秒的操作:
- 刷新100个脏页到磁盘(可能)
- 合并至多5个插入缓冲(总是)
- 将日志缓冲刷新到磁盘(总是)
- 删除无用的undo页(总是)
- 刷新100个或者10个脏页到磁盘(总是)
backgroup loop执行的操作:
- 删除无用的undo页(总是)
- 合并20个插入缓冲(总是)
- 跳回到祝循环(总是)
- 不断刷新100个页直到符合条件(可能,跳转到flush loop中完成)
1.2版本之前
在1.0版本基础上进行了部分优化:
- 合并插入缓冲时,合并插入缓冲的数量可以配置。(innodb_io_capacity值的5%)
- 在从缓冲区刷新脏页的时候,刷新脏页的数量可以进行配置。(innodb_io_capacity值)
1.2版本
为了减轻Master Thread 的压力,将刷新页的操作从Master Thread线程分离到一个单独的Page Cleaner Thread中。同时在InnoDB闲置的时候,会执行每10秒的操作,其余的时间执行每秒的操作。