理解redo(5)深入学习RBA

1 定义

RBA就是redo entries在重做日志文件中所对应的地址

2 组成

RBA由三部分组成:
序列号(4个字节)
块号(4个字节)
起始字节(2个字节)
以上都是16进制存储

3 类型

3.1 LRBA

定义:块第一次变脏时所对应的redo entries在redo log file里的位置

注释:CKPT-Q按LRBA的顺序维护脏块,执行检查点事件时,DBWn从CKPT-Q按LRBA的顺序写出。LRBA也就是checkpoint position。从检查点位置(LRBA)处,应用重做记录到On disk rba处,这个过程就是前滚

理解redo(5)深入学习RBA_第1张图片

3.2 HRBA

定义:脏块在buffer cache中最近一次被更新时产生的redo entries在redo log file里的位置

注释:如果HRBA > on-disk RABA,那么HRBA所对应的相关redo entries还在redo log buffer中,如果实例crash,则HRBA是不可能被恢复的。

3.3 checkpoint RBA

定义:在CKPT-Q上第一个脏数据块的LRBA,这个RBA之前的脏数据已经被全部写入磁盘。

注释:当一个checkpoint事件发生的时候,CKPT进程会记录下当时所写的重做日志记录的地址(即RBA),此时记录的RBA被称之为checkpoint RBA,从上一个checkpoint RBA到当前checkpoint RBA之间的日志所保护的buffer cache中的脏块接下来将会被写进数据文件。

3.4 on-disk RBA

定义:LGWR 写日志文件的最末位置的地址,磁盘中重做日志文件的最后一条重做记录。

注释:on disk rba是oracle前滚操作的终点。on disk 顾名思义 就是'在磁盘上'的意思.比这个更高的rba,都在log buffer中,还没有来的急被写进磁盘中的日志文件.所以是不能被用于恢复的。

3.5 target RBA

定义:检查点事件结束时的checkpoint RBA

注释:为了缩短实例恢复的时间,DBWn会尽力把checkpoint RBA的目标值定的长远点。

理解redo(5)深入学习RBA_第2张图片

4 相关视图

4.1 查看The incremental checkpoint RBA and the on-disk RBA --X$KCCCP

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列是心跳

4.2 查看脏块的LRBA和HRBA--X$BH、X$KCVFH(10g之后在x$bh里面只能查看LRBA)

--LRBA

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的源

4.3 查看target RBA
--X$TARGETRBA

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


4.4 完全检查点的checkpoint RBA--x$kccrt(内核缓存控制文件重做线程)

SQL> select rtckp_rba_seq,rtckp_rba_bno,rtckp_rba_bof from x$kccrt;

RTCKP_RBA_SEQ RTCKP_RBA_BNO RTCKP_RBA_BOF
------------- ------------- -------------
          112             7            16


5 小结

RBA的信息不是必须的,因为如果以resetlogs方式打开数据库,则所有的序列号都将被重置为1。Redo 与checkpoint 关系很大,当设log_checkpoints_to_alert 参数为true后,checkpoint 发生时会写入alert log里。在备份与恢复的原理上,这里引用谢老的一句名言:“那就是数据文件的头上不仅包含了checkpoint_change#,更重要的是它包含了这个checkpoint_change#所在的logfile的sequence#,准确的说是rba。有了rba,在恢复时就能准确的知道到底需要哪个logfile(archivelog or redo)”

通过上面的阐述,现在大家知道谢老话中的“rba”是何方神圣了吧。

你可能感兴趣的:(redo)