检查点是 Oracle 数据库内部一个重要的驱动机制。Oracle 按每三秒中把数据库时间分成连续的间隔,每个三秒钟间隔用一个十进制的数字序列唯一表示,这个数字序列就是 SCN(system change number),一个SCN 就是一个检查点间隔,唯一代表了数据库内的一个三秒钟时间段。
在上一个 SCN 间隔(三秒钟)结束、新的三秒钟间隔开始时,检查点进程(CKPT)就会产生新的检查点信息 SCN,并在第一时间把新的 SCN 在控制文件记录下来,之后,CKPT 就会一直等待,等待三秒钟结束这一时间点的到来,这个时间点称为完全检查点,在完全检查点时,CKPT 会触发数据库写进程(DBWn),知 DBWn 把当前检查点队列中凡是已标记为提交状态的数据块从缓存高速缓冲区读出并写入数据文件中,DBWn 在执行之前会首先触发一次日志写,以确保写入数据文件的提交过的数据块所对应的重做条目都已持久化记录在联机重做日志文件中。在 DBWn 把检查点队列记录的所有已提交的数据块全部成功写入数据文件后,CKPT 会用控制文件记录的 SCN 把数据库全部的数据文件头的 SCN 字段值刷新一遍,刷新完成后,每个数据文件头的 SCN 字段值和控制文件保持了一致,这就是一致性数据库的标志。在 Oracle内部,检查点机制在实例启动后就持续不间断地向前推进,Oracle 设计检查点机制的唯一目的就是为了执行实例恢复。