当前位置: 代码迷 >> 综合 >> mysql checkPoint
  详细解决方案

mysql checkPoint

热度:77   发布时间:2024-02-12 17:10:35.0

为了提高操作效率,mysql中对数据进行增删改操作后并没有立即写入到磁盘中,而是记录到了buffer pool缓冲池中,这也就会导致缓冲池中的数据会与磁盘中数据不一致,为了避免数据库宕机时发生缓冲池数据没有被同步到磁盘中,还使用了(redo log)重做日志去记录操作,数据库在故障重启之后会根据该日志重做来恢复数据,保证数据持久化。但是redo log的空间并不能无限扩大,缓冲池中未同步的记录即脏页也需要及时写入磁盘,checkPoint就是指什么时候将缓冲区中的脏页刷新到磁盘中去。

redo log分为两块区域,一个叫ib_logfile0,一个叫ib_logfile1,它们是循环去写的,也就是说0满了就去写1,1满了再去写0,这样就存在老数据覆盖的问题。

下面说一下checkPoint的分类Innodb中有两种checkPoint:sharp checkPoint、fuzzy checkPoint,sharp checkPoint指每次当数据库关闭时才将脏页刷新至磁盘,这是默认的工作方式。此外还支持fuzzy checkPoint,它是在数据库正常运行时,在不同的时机将脏页刷新至磁盘,下面简单说一下。

Master Thread checkpoint:以每秒或10秒的频率,异步将部分脏页刷新至磁盘,用户线程的数据操作不会被干扰

FLUSH_LRU_LIST Checkpoint:mysql中缓冲池本身需要保证有一定的空闲页面,它使用了lru的方式,如果空闲页面数量到达临界点的话,空闲页的数量由innodb_lru_scan_depth参数表来控制的,会将lru列表最久没有被使用的脏页刷新至磁盘

Async/Sync Flush Checkpoint:上面说了重做日志redo log是循环写入的,每次需要覆盖旧日志,就会触发checkPoint,将旧日志中涉及的脏页刷新至磁盘中

Dirty Page too much Checkpoint:当缓冲区中脏页数量过多,到达一定比例时,脏页占缓冲区比例由innodb_max_dirty_pages_pct配置,innodb_max_dirty_pages_pct的默认值在innodb 1.0之前是90%,之后是75%,会进行将部分脏页刷至磁盘的操作。

通过不同的checkPoint将脏页在mysql运行时就不断的将脏页刷至磁盘,从而解决缓冲区内存不足、redo log 大小不足,mysql宕机恢复时磁盘数据与redo log差异过大恢复时间过长的问题。

 

 

  相关解决方案