
2、增量检查点
说白了,就是
CKPT 每 3 秒一次的检查 DBWn 写进度并在控制文件中记录检查点位置(checkpoint position)和更新 heartbeat 信息
以及
CKPT 定期触发 DBWn 去写 checkpoint queue 中的脏数据
这两项操作合一起被称为增量检查点。 -->可能这块描述的过于笼统,大家继续往下看:-)
我们都知道被修改过的数据块,在 oracle 中都被统称为脏数据块(dirty buffer)。所有的脏块被一个链表串起来,称做检查
点队列(checkpoint queue)。在 buffer cache 中,每一个块都有一个 buffer header 简称 BH, 在 BH 中有一个 ckptq 项, 此
项目中记录了指向检查点队列上一个块和下一个块的指针。 如果某一个块不在检查点队列中,他的 ckptq 项为空.通过
ckptq 项 oracle 将所有的脏块串成了一个双向链表。这个双向链表就是检查点队列了。
Oracle 从 8i 开始引入了检查点队列(checkpoint queue)的概念,用于记录数据库里面当前所有的 dirty buffer 的信息,
这些 dirty buffer 的信息按被修改的时间先后存放在 checkpoint queue 里面(当块首次被更改时,块会立即被加进检查点
队列),所涉及的条目主要包含 RBA (Redo Block Address,重做日志里面用于标识事务期间数据块在重做日志里面发生
更改的编号)和数据块的数据文件号和块号。
不 论数据块(buffer)更改几次,它在 checkpoint queue 里面的位置始终保持不变,checkpoint queue 也只会记录它最早
的 RBA(这个最早的 RBA 其实就是 Low RBA,也就是数据块第一次被修改时所对应的 RBA),从而保证最早更改的数据
块能够尽快从内存写入数据文件。DBWR 每到一定的时机,就会被触发 (DBWn 并不是只有当检查点发生的时候才写,
它大约有 10 几种条件触发写操作),沿着检查点队列的顺序刷新脏块,同时 CKPT 进程,会监控着检查点队列 的长度,
当检查点队列的长度达到一定限制时(具体有几个参数来确定 checkpoing queue 的长度,下面会提到比如
log_checkpoint_timeout,fast_start_mttr_target 等),CKPT 会通知 DBWR 写脏块。CKPT 会根据几个参数的设置和 I/O
的速度以及繁忙程度,计算出来一个 Target rba(目标 rba),DBWn 会沿着检查点队列,按照 dirty buffer 的 Low RBA 顺
序将所有 Target rba 之前对应的脏块从内存写入数据磁盘文件。当 CKPT 通知完 DBWn Target rba 后,CKPT 的任务
评论