MySql的checkpoint

前言

对数据库中数据进行增删改时,都是先在buffer pool中完成,为了提升事务的操做效率,buffer pool中数据并不会当即写入磁盘,因此可能出现内存中数据和磁盘数据不一致的状况。mysql

若是buffer pool发生故障致使数据没法持久化,形成磁盘和buffer pool数据不一致。算法

为了防止内存中修改的数据还没有写入磁盘,发生故障而不能持久化的问题。能够经过redo log先行的方式进行保障。 redo log能够在故障重启以后作“重作”,保障了事务的持久化特性,可是redo log空间不可能无限扩大,对于内存中已修改未提交到磁盘的数据,也就是“脏页”,也须要写入磁盘。sql

对于内存中“脏页”的处理就是checkpoint的工做,在必定状况下将脏页放入磁盘。数据库

checkpoint主要解决如下问题:异步

  1. 缩短数据库恢复的时间。
  2. 缓冲池不够用时,将脏页刷入磁盘。
  3. 重作日志不可用时,刷新脏页。

故障恢复时只须要对checkpoint后的重作日志进行恢复,缩短了恢复时间。 缓冲区不够用时,采用lru算法,使部分脏页刷入磁盘。async

checkpoint分类

checkpoint分为两种:性能

  • sharp checkpoint:在关闭数据库时,将buffer pool中的脏页所有刷入磁盘。
  • fuzzy checkpoint:在数据库正常运行时,找到不一样时机将脏页写入磁盘,一部分一部分的刷入磁盘,不会由于一次性刷入磁盘形成性能问题。
  1. master thread checkpoint

master thread中,每秒或每10秒一次的频率将脏页从内存刷入磁盘,这个过程是异步的。线程

  1. flush_lru_list checkpoint

flush_lru_list checkpoint是在单独的page cleaner线程中执行的。lru列表是buffer pool的lru列表,lru空闲列表中保留必定数量的空闲页面,来保证buffer pool中有足够的空间应对新的数据库请求。日志

在空闲列表不足时,发生flush_lru_list checkpoint,空闲数量阈值是能够配置的。事务

  1. async/sync flush checkpoint

async/sync flush checkpoint是在单独的page cleaner线程中执行的。在重作日志不可用时,将buffer pool中的一部分脏数据刷新到磁盘。 经过配置阈值,在redo log空间不足指定阈值时进行刷新。

  1. dirty page too much checkpoint dirty page too much checkpoint是在master thread线程中每秒一次的频率实现的。 dirty page too much 意味着buffer pool中脏页过多,执行checkpoint脏页刷入磁盘,保证buffer pool中有足够的可用页面。

总结

mysql为提升事务执行效率,并不会每次都和磁盘交互进行持久化,经过日志先行策略保证事务的持久化。 对于事务修改过程当中的脏页,经过异步方式刷盘,经过checkpoint达到内存和redo log可用空间的目的。

相关文章
相关标签/搜索