对RBA TARGET、CHECKPOINT RBA 以及 实例恢复过程 的理解

来源:互联网 发布:移动数据采集器 编辑:程序博客网 时间:2024/06/05 06:18

对于像我这样刚刚接触ORACLE备份与恢复的人来说,熟练掌握ORACLE复杂的恢复场景是非常困难的,那么我们就从头开始,从小的知识点开始打牢这个基础,毕竟备份与

恢复是作为DBA的必要技能,而且这个非常重要,如果出了问题,那可能会对客户和自己造成很大的损失。


以下我用一个例子来讲解我对这两个属于以及实例恢复的过程的一点理解:


图例中的节点说明:

A1  是上一次RBA TARGET

A2  是最新的RBA TARGET
B   是检查点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] view plaincopyprint?
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] view plaincopyprint?
SQL> select rtckp_rba_seq,rtckp_rba_bno,rtckp_rba_bof from x$kccrt; 
原创粉丝点击