MySql-CheckPoint机制

221 阅读4分钟

MySQL 的 Checkpoint 机制是 InnoDB 存储引擎中用于确保数据一致性、优化磁盘写入性能并支持崩溃恢复的重要机制。(具体实现)它通过将缓冲池 (Buffer Pool) 中的脏页写回磁盘并更新相关元信息来实现数据的持久化和优化。

Checkpoint 的核心作用

  • 保证崩溃恢复能力
    将脏页和事务日志的状态一致性写入磁盘,确保即使发生崩溃,系统也能通过 Redo Log 恢复到最近的 Checkpoint 状态。

  • 释放 Redo Log 空间
    Checkpoint 将 Redo Log 中的已提交事务标记为完成,允许覆盖旧的日志空间,避免日志过快写满。(Redo Log是循环使用的)

  • 优化磁盘写入性能
    通过批量刷脏页,减少频繁随机的磁盘写操作,提高 I/O 性能。

Checkpoint 的触发条件

Checkpoint 的触发主要受以下条件控制:

  1. Redo Log 写满

    • 当 Redo Log 空间不足(接近 75% 时),触发 Checkpoint 强制刷新脏页。
  2. 脏页数量超过阈值

    • Buffer Pool 中的脏页比例超过设定阈值(由参数 innodb_max_dirty_pages_pct 控制)。
  3. 后台定期触发

    • InnoDB 后台线程周期性触发 Checkpoint,默认每秒检查一次。
  4. 数据库关闭或表关闭

    • 在关闭数据库或表时,触发 Checkpoint 将所有未刷新的脏页写入磁盘。
  5. 手动触发

    • 可以通过命令 FLUSH TABLES 或相关工具手动触发 Checkpoint。

Checkpoint 的类型

InnoDB 中的 Checkpoint 有多种类型,不同类型的 Checkpoint 触发机制和用途有所不同:

(1)Flush Checkpoint

  • 刷新脏页到磁盘的最主要类型。
  • 在系统运行期间定期触发,确保缓冲池中的脏页不会填满,释放内存。

(2)Async Checkpoint

  • 后台线程异步触发,缓解突发 I/O 压力。
  • 适合正常运行的场景,数据会逐渐被写入磁盘而不是一次性大量写入。

(3)Sync Checkpoint

  • 在数据库关闭或崩溃恢复期间触发。
  • 确保所有的脏页都被写入磁盘,保证系统可以从 Checkpoint 恢复一致性。

(4)Fuzzy Checkpoint

  • 不会一次性刷新所有脏页,而是根据磁盘 I/O 和事务日志的情况逐步刷新。
  • 优化性能,避免频繁触发大规模刷盘操作。

Checkpoint 的工作原理

Checkpoint 的执行流程如下:

  1. 标记已处理的日志位置

    • InnoDB 会记录当前 Checkpoint 对应的 Redo Log 位置(LSN, Log Sequence Number),表示该位置之前的日志已经被刷盘和应用到数据文件中。
  2. 刷新脏页到磁盘

    • 将 Buffer Pool 中的脏页写入磁盘,同时更新数据文件的元信息。
  3. 更新 Checkpoint 信息

    • 将最新的 Checkpoint 信息(LSN)写入 Redo Log 文件头部,用于崩溃恢复时定位日志的起始点。

关键参数

  • innodb_max_dirty_pages_pct

    • 默认值:75
    • 控制脏页比例,当超过此比例时,触发 Checkpoint。
  • innodb_io_capacity

    • 控制后台线程的 I/O 写入速度,用于限制每秒写入磁盘的页数。
  • innodb_flush_log_at_trx_commit

    • 决定事务提交时日志的刷盘策略,从而间接影响 Checkpoint 的频率。

Checkpoint 和崩溃恢复

Checkpoint 的目的是确保系统在发生崩溃时能够快速恢复:

  1. 崩溃恢复时,从最近的 Checkpoint 开始重放 Redo Log。
  2. Redo Log 的起点是 Checkpoint 记录的 LSN,终点是日志文件的末尾。
  3. 通过 Checkpoint,系统避免了从头重放所有日志的低效过程。

问题:Buffer Pool中的数据何时写入到磁盘?

刷新脏页(Dirty Pages)

  • 数据页在 Buffer Pool 中被修改后称为 脏页 (Dirty Pages) ,需要定期刷新到磁盘。

  • 刷新脏页的时机包括:

    1. Buffer Pool 使用率接近阈值

      • 当 Buffer Pool 空间不足时,会触发脏页写回磁盘,以释放内存空间供新数据页使用。
    2. 脏页太多

      • 当脏页的比例超过设定阈值(由参数 innodb_max_dirty_pages_pct 控制,默认 75%)时,会触发刷新。
    3. 定期刷新 (InnoDB后台线程)

      • InnoDB 后台线程会以周期性的方式刷新脏页,默认每秒检查一次。
    4. CheckPoint机制