对数据库中数据进行增删改时,都是先在buffer pool中完成,为了提升事务的操做效率,buffer pool中数据并不会当即写入磁盘,因此可能出现内存中数据和磁盘数据不一致的状况。mysql
若是buffer pool发生故障致使数据没法持久化,形成磁盘和buffer pool数据不一致。算法
为了防止内存中修改的数据还没有写入磁盘,发生故障而不能持久化的问题。能够经过redo log先行的方式进行保障。 redo log能够在故障重启以后作“重作”,保障了事务的持久化特性,可是redo log空间不可能无限扩大,对于内存中已修改未提交到磁盘的数据,也就是“脏页”,也须要写入磁盘。sql
对于内存中“脏页”的处理就是checkpoint的工做,在必定状况下将脏页放入磁盘。数据库
checkpoint主要解决如下问题:异步
故障恢复时只须要对checkpoint后的重作日志进行恢复,缩短了恢复时间。 缓冲区不够用时,采用lru算法,使部分脏页刷入磁盘。async
checkpoint分为两种:性能
master thread中,每秒或每10秒一次的频率将脏页从内存刷入磁盘,这个过程是异步的。线程
flush_lru_list checkpoint是在单独的page cleaner线程中执行的。lru列表是buffer pool的lru列表,lru空闲列表中保留必定数量的空闲页面,来保证buffer pool中有足够的空间应对新的数据库请求。日志
在空闲列表不足时,发生flush_lru_list checkpoint,空闲数量阈值是能够配置的。事务
async/sync flush checkpoint是在单独的page cleaner线程中执行的。在重作日志不可用时,将buffer pool中的一部分脏数据刷新到磁盘。 经过配置阈值,在redo log空间不足指定阈值时进行刷新。
mysql为提升事务执行效率,并不会每次都和磁盘交互进行持久化,经过日志先行策略保证事务的持久化。 对于事务修改过程当中的脏页,经过异步方式刷盘,经过checkpoint达到内存和redo log可用空间的目的。