检查点(Checkpoint)

image-20250624183559874

它通过 将内存中的脏数据块(Dirty Blocks)写入磁盘 ,并更新控制文件和数据文件头,为数据库提供一个 恢复起点 。

同步数据文件与内存缓冲区(Buffer Cache)状态

Checkpoint的作用

1. 缩短崩溃恢复时间

  • Checkpoint标记了所有在某一时间点之前已写入日志的已提交的数据块。

  • 崩溃恢复时,只需从最后一个Checkpoint对应的Redo Log记录开始重放(Redo),显著减少恢复所需处理的日志量。

2. 保证数据文件一致性

  • Checkpoint前,所有已提交事务的修改均已写入数据文件,确保数据文件与日志记录一致。

3. 统一数据库状态视图

  • 控制文件和数据文件头中记录的Checkpoint SCN(系统变更号),用于标识数据库的一致性时间点。

4. 释放Redo日志空间

  • 在归档日志模式下(ARCHIVELOG),Checkpoint触发后,旧的Redo日志可以被覆盖或删除。

Checkpoint的触发条件

手动触发

自动触发

  • Redo日志切换(Log Switch):

    • 当日志组写满并切换到下一组时,触发Checkpoint。
  • 时间间隔触发:

    • 通过参数 LOG_CHECKPOINT_TIMEOUT 设定时间间隔(单位为秒)。
  • 日志量触发:

    • 当生成的Redo日志量达到 LOG_CHECKPOINT_INTERVAL(单位为数据块数量)。
  • 关闭数据库时:

    • SHUTDOWN IMMEDIATE 或 SHUTDOWN TRANSACTIONAL 会触发完全Checkpoint。
  • 表空间离线(Offline):

    • 执行 ALTER TABLESPACE … OFFLINE 时触发局部Checkpoint。

Checkpoint的工作流程

以 完全检查点(Full Checkpoint) 为例,流程如下:

刷新脏块到磁盘(Disk Write)

  • DBWn(Database Writer)进程将Buffer Cache中所有已提交的脏块写入数据文件。

  • 确保所有Checkpoint SCN之前的修改均已持久化到磁盘。

更新控制文件和数据文件头

  • 记录最新的Checkpoint SCN到控制文件(V$DATAFILE_HEADER.CHECKPOINT_CHANGE#)。

  • 更新每个数据文件头中的Checkpoint SCN和时间戳。

清理Redo日志(可选)

  • 如果处于NOARCHIVELOG模式,且日志组已不再需要,可能会被覆盖重用。

Checkpoint的类型

1. 完全检查点(Full Checkpoint)

  • 全库范围:强制所有脏块写入数据文件,更新所有数据文件头的Checkpoint SCN。

  • 触发场景:手动执行、日志切换(依赖参数设置)、数据库关闭。

2. 增量检查点(Incremental Checkpoint)

  • 渐进式更新:

    • 仅记录当前脏块的最早Change Vector(RBA, Redo Byte Address),而非立即刷新所有脏块。

    • CKPT进程定期更新控制文件中的检查点进度。

  • 触发场景:主要由后台进程CKPT根据恢复时间目标(FAST_START_MTTR_TARGET)自动触发。

  • 作用:减少完全Checkpoint的I/O压力,平衡恢复时间与性能。

3. 局部检查点(Partial Checkpoint)

  • 针对特定对象:例如表空间离线或数据文件脱机。

Checkpoint相关关键参数

1. FAST_START_MTTR_TARGET

  • 功能:设定数据库的预期崩溃恢复时间(秒)。

  • 原理:自动触发增量检查点,确保脏块数量足够少以满足恢复时间目标。

  • 建议值:通常设置为 300(5分钟)。

2. LOG_CHECKPOINT_TIMEOUT

  • 功能:每隔N秒触发一次Checkpoint。

  • 风险:过短的值可能导致频繁I/O负载。

3. LOG_CHECKPOINT_INTERVAL

  • 功能:当Redo日志生成的块数量达到参数设置值时触发Checkpoint。

  • 单位:操作系统块数量(通常为512 Bytes)。

Checkpoint与性能的权衡

1. 过高频率的Checkpoint

  • 优点:缩短恢复时间,减少Redo日志占用量。

  • 缺点:频繁内存刷盘增加I/O压力,影响联机事务性能。

2. 过低频率的Checkpoint

  • 优点:减少I/O操作,提高事务吞吐量。

  • 缺点:崩溃恢复时间变长,可能导致长时间停机。

最佳实践:

  • 启用FAST_START_MTTR_TARGET,自动平衡恢复时间和性能。

  • 在高并发OLTP场景中,避免设置固定间隔的Checkpoint(如LOG_CHECKPOINT_TIMEOUT)。