分类: Oracle
2008-12-12 15:57:59
检查点总结
8以前都是完全检查点,每次触发,则记录当前数据库SCN号,并将内存里所有截至到该SCN号的脏数据块都刷新到数据文件里。从而同步数据文件。
随 着内存越来越便宜,以及控制实例恢复的需要,完全检查点已经不适合实际情况了。于是从oracle 8开始,oracle引入了增量检查点,通过增量检查点来减少实例恢复的时间。为此,oracle引入了checkpoint
queue,按照数据块第一次被修改的先后顺序,将脏数据块挂到该队列上。同时还在该队列上记录了每个脏数据块第一次被修改时产生的redo entry的地址,这叫LRBA。
增量检查点的启动时机由以下参数控制:
·fast_start_mttr_target:应用从CKPT position到最后一个redo entry之间所有redo entry所花的时间。也就是实例前滚所花费的时间。
·LOG_CHECKPOINT_INTERVAL:如果自从上一次检查点启动以来所累积的日志块个数达到该参数,则触发增量检查点,从而触发DBWn写脏块。
·LOG_CHECKPOINT_TIMEOUT:两次检查点启动的时间间隔。实际也就是控制脏块在内存里待多长时间的参数。
·90%*(SUM(log_size) – MAX(log_size)):如果产生的redo块的量达到该值,则启动增量检查点。
只要满足上面条件中的任何一个,就会启动增量检查点。增量检查点一旦启动,则会记录当前CKPT SCN。
然后通知DBWn进程去写checkpoint queue上所挂载的脏块,至于写到哪个脏块为止,则不超过到当前CKPT SCN。
DBWn进程是批量写脏块的,脏块个数不到一定程度,DBWn不会真的去写。而每次写多少个脏块的个数则由一个隐藏参数控制。
每 隔3秒钟(这叫heartbeat,心跳),“增量检查点”也还会启动一次,只不过这时增量检查点启动只是查看一下checkpoint
queue,将该队列上的第一个脏块所对应的redo block的地址写入控制文件,也就是将CKPT Position写入控制文件,并不会触发DBWn进程写脏块。所以是打引号的增量检查点。