Oracle检查点checkpoint 基础知识

在Oracle里面,检查点分为两种:完全检查点和增量检查点。

1、完全检查点(full checkpoint)

在Oracle8i之前,数据库的发生的检查点都是完全检查点,完全检查点会将数据缓冲区里面所有的脏数据块写入相应的数据文件中,并且同步数据文件头和控制文件,保证数据库的一致。完全检查点在8i之后只有在下列两种情况下才会发生:

(1、)DBA手工执行alter systemcheckpoint的命令;

(2、)数据库正常shutdown(immediate,transcational,normal)。

由于完全检查点会将所有的脏数据库块写入,巨大的IO往往会影响到数据库的性能。因此Oracle从8i开始引入了增量检查点的概念。

2、增量检查点 (incrementalcheckpoint)

检查点队列,用于记录数据库里面当前所有的脏数据块的信息,DBWR 根据这个队列而将脏数据块写入到数据文件中。检查点队列按时间先后记录着数据库里面脏数据块的信息,里面的条目包含RBA(Redo Block Address),重做日志里面用于标识检查点期间数据块在重做日志里面第一次发生更改的编号)和数据块的数据文件号和块号。

在检查点期间不论数据块更改几次,它在检查点队列里面的位置始终保持不变,检查点队列也只会记录它最早的RBA,从而保证最早更改的数据块能够尽快写入。当DBWR将检查点队列里面的脏数据块写入到数据文件后,检查点的位置也要相应地往后移,CKPT每三秒会在控制文件中记录检查点的位置,以表示Instance Recovery时开始恢复的日志条目,这个概念称为检查点的“心跳”(heartbeat)。

注意:增量检查点并不去更新数据文件头,只是在控制文件中记录了checkpoint progress record这个区域,记下lowrba,on-disk rba等信息。这些信息就可以用来快速恢复。

每隔3秒钟ckpt会去更新控制文件中的checkpoint progress recored区域,记录checkpoint执行的情况。

解疑:这里应该是只更新控制文件,每3秒不是更新数据文件头,而是在控制文件中记录checkpoint的执行情况,基于增量检查点和checkpoint  queue的原理,在发生检查点的时候,ckpt 进程每次只是告诉dbwr,写dirty buffe要一直写到最新这个位置(发生检查点:也就是alter system checkpoint),这样做呢,仅仅是告诉dbwr一个checkpoint queue中的结束点,ckpt绝对不会等到dbwr写完所有脏数据在更新控制文件和数据文件头,而是每3秒钟,在控制文件中的checkpoint progress recored区域中报告一下dbwr最新写入的位置(也就是dbwr的写状态的scn)。这样使得,比如数据库要做恢复的时候(instance recovery)可以从这个最新报告的scn位置开始做恢复,而不是从数据文件中的checkpoint  scn开始做恢复,这样将缩短恢复时间,尤其是instance  crash的情况下启动更快。另外要注意的是,检查点发生的时候,ckpt 去更新数据文件头和控制文件,并不是把当前检查点发生时候的scn 更新进去,而是把上一次dbwr写入已经完成的检查点发生时候的  scn 更新进去,也就是说,更新控制文件和数据文件头是滞后于检查点的发生的,这个从恢复的原理也很容易理解,因为检查点发生的时候dirtybuffer还没有写入,自然不能立即更新成当前的scn了。

检查点位置发生变更后,Oracle里面通过4个参数用于控制检查点位置和最后的重做日志条目之间的距离。在这里面需要指出的是,多数人会将这4个参数看作控制增量检查点发生的时间。事实上这是错误的,这4个参数是用于控制检查点队列里面的条目数量,而不是控制检查点的发生。

(1)fast_start_io_target

该参数用于表示数据库发生Instance Recovery的时候需要产生的IO总数,它通过v$filestat的AVGIOTIM来估算的。比如我们一个数据库在发生Instance Crash后需要在10分钟内恢复完毕,假定OS的IO每秒为500个,那么这个数据库发生Instance Recovery的时候大概将产生500*10*60=30000次IO,也就是我们将可以把fast_start_io_target设置为 30000。

(2)fast_start_mttr_target

我们从上面可以看到fast_start_io_target来估算检查点位置比较麻烦。Oracle为了简化这个概念,从9i开始引入了 fast_start_mttr_target这么一个参数,用于表示数据库发生InstanceRecovery的时间,以秒为单位。这个参数我们从字面上也比较好理解,其中的mttr是mean time to recovery的简写,如上例中的情况我们可以将fast_start_mttr_target设置为600。当设置了 fast_start_mttr_target后,fast_start_io_target这个参数将不再生效,从9i后fast_start_io_target这个参数被Oracle废除了。

(3)log_checkpoint_timeout

该参数用于表示检查点位置和重做日志文件末尾之间的时间间隔,以秒为单位,默认情况下是1800秒。

(4)log_checkpoint_interval

该参数是表示检查点位置和重做日志末尾的重做日志块的数量,以OS块表示。

(5)90% OFSMALLEST REDO LOG

除了以上4个初始化参数外,Oracle内部事实上还将重做日志文件末尾前面90%的位置设为检查点位置。在每个重做日志中,这么几个参数指定的位置可能不尽相同,Oracle将离日志文件末尾最近的那个位置确认为检查点位置。


猜你喜欢

转载自chenlin10058.iteye.com/blog/1558382