对于像我这样刚刚接触ORACLE备份与恢复的人来说,熟练掌握ORACLE复杂的恢复场景是非常困难的,那么我们就从头开始,从小的知识点开始打牢这个基础,毕竟备份与
恢复是作为DBA的必要技能,而且这个非常重要,如果出了问题,那可能会对客户和自己造成很大的损失。
以下我用一个例子来讲解我对这两个属于以及实例恢复的过程的一点理解:
图例中的节点说明:
A1 是上一次RBA TARGET
A2 是最新的RBA TARGETB 是检查点RBA(CHECKPOINT RBA)
C 的end of the redo
* 代表还是脏的RBA
- 表示已经刷掉的RBA
第一阶段:增量检查点触发了DBWR,将TARGET RBA后的脏块按LRBA的顺序放入到检查点队列中
<60个rba> |
---A1---------------BC
end of the redo
假设我们的MTTR是1个小时,而每分钟产生1个RBA
那此时,A1后面的60个RBA的脏块头,都挂到检查点队列,并刷新到磁盘
所以A1到BC都不带*了
第二阶段,此时新的RBA不断生成,对吧
<50个rba> |<10个rba>
---A2---------------B*******C
end of the redo
在B点检查点RBA后,又生成了10个脏的RBA吧
此时每3秒来检查当前的RBA TARGET,也就是A2这个点
这个时候,不必触发DBWR,所以DBWR休眠
第三阶段 继续下一个3秒来唤醒DBWR
<20个rba>|<40个rba>
------------A2------B*****************C
end of the redo
此时有40个脏RBA生成了吧
那此时当前的RBA TARGET的A2迁移了
每次3秒检查都把新的RBA TARGET写到控制文件
不会触发DBWR写磁盘,因为新的脏RBA还没到A2这个点
第四个阶段 新的脏RBA继续生成,A2已经前进到B点了
|<60个rba>
--------------------A2B*********************C
end of the redo
也就是说,如果继续生成第61个脏RBA的话,就不满足MTTR的条件了
如果第61个脏RBA都生成了,还不刷到磁盘,就意味着您得1个小时1分钟才能恢复数据库
所以,ORACLE为了避免这种情况,当A2和B重合的时候,尽量早的触发DBWR
此时,把这60个脏RBA对应的脏块头,按LRBA的顺序放到检查点队列
第五个阶段 DBWR刷新完成,B的位置跟C重叠
<60个rba> |<60个rba> |
---A1---------------+-----------------------BC
★ 对上图的总结与说明 :
A2(A2其实是在前一次的A1与B之间移动,向B靠拢)是在向B靠拢, B是不动的(因为B是前一次的checkpoint rba,在它前面的所有脏块已经被移动
到检查点队列中,现在只有它后面的才是脏块),而C是end of redo 也就是 最新写入 redo buffer的内容,它是在向前走的,所以受到fast_start_mttr_target
参数的影响,A2也会随之向C(B)方向前进。
以下是一些术语的定义:
checkpoint RBA
定义:在CKPT-Q上第一个脏数据块的LRBA,这个RBA之前的脏数据已经被全部写入磁盘。
注释:当一个checkpoint事件发生的时候,CKPT进程会记录下当时所写的重做日志记录的地址(即RBA),此时记录的RBA被称之为checkpoint RBA
,从上一个checkpoint RBA到当前checkpoint RBA之间的日志所保护的buffer cache中的脏块接下来将会被写进数据文件。
on-disk RBA
定义:LGWR 写日志文件的最末位置的地址,磁盘中重做日志文件的最后一条重做记录。
注释:on disk rba是oracle前滚操作的终点。on disk 顾名思义 就是'在磁盘上'的意思.比这个更高的rba,都在log buffer中,还没有来的急被写进磁盘
中的日志文件.所以是不能被用于恢复的。
target RBA
定义:检查点事件结束时的checkpoint RBA
注释:为了缩短实例恢复的时间,DBWn会尽力把checkpoint RBA的目标值定的长远点。
以下是摘抄网上其他资料的一些对于该块功能的视图介绍:
查看The incremental checkpoint RBA and the on-disk RBA --X$KCCCP
[sql] view plaincopyprint?
SQL> select CPDRT,CPLRBA_SEQ||'.'||CPLRBA_BNO||'.'||CPLRBA_BOF "Low
RBA",CPODR_SEQ||'.'||CPODR_BNO||'.'||CPODR_BOF "On disk RBA",CPODS,CPODT,CPHBT from x$kcccp;
CPDRT Low RBA On disk RBA CPODS CPODT CPHBT
---------- --------------- --------------- ---------------- -------------------- ----------
35 686.124.0 686.220.0 2325376 03/02/2008 15:18:54 648319278
注释:
CPDRT列是检查点队列中的脏块数目.
CPODS列是on disk rba的scn
CPODT列是on disk rba的时间戳
CPHBT列是心跳
查看脏块的LRBA和HRBA--X$BH、X$KCVFH(10g之后在x$bh里面只能查看LRBA)
--LRBA
[sql] view plaincopyprint?
SQL> select lrba_seq,lrba_bno from x$bh where lrba_seq!=0;
LRBA_SEQ LRBA_BNO
---------- ----------
107 42042
107 42260
107 42120
--HRBA
SQL> select hxfil,fhrba_seq,fhrba_bno,fhrba_bof from x$kcvfh;
HXFIL FHRBA_SEQ FHRBA_BNO FHRBA_BOF
---------- ---------- ---------- ----------
1 76 6618 16
2 76 6618 16
3 76 6618 16
4 76 6618 16
为什么要查询x$kcvfh,是因为x$kcvfh是v$datafile_header的源
查看target RBA
--X$TARGETRBA
[sql] view plaincopyprint?
SQL> select target_rba_seq,target_rba_bno,target_rba_bof from x$targetrba;
TARGET_RBA_SEQ TARGET_RBA_BNO TARGET_RBA_BOF
-------------- -------------- --------------
0 0 0
完全检查点的checkpoint RBA--x$kccrt(内核缓存控制文件重做线程)
SQL> select rtckp_rba_seq,rtckp_rba_bno,rtckp_rba_bof from x$kccrt;