今天來和大家簡單談一下rba ,rba = redo byte address 。
講到rba,這裡涉及到了幾點需要大家提前預知,即controlfile header,ckpt process 與 dbwn process , dirty buffer 。
先來看一下RBA的構成:
它由3部分組成,4byte+4byte+2byte分別為 logfile sequence number ,logfile block number,byte offsetinto the block ,即redo 序號,redo block 號,以及位移量。
並且全部使用16進位。
例如:rba= 0x000024.000011bd.0010
seq#=0x000024=36
blk#=0x000011bd=4541
ofs#=0x0010=16
接下來說一下instance recovery
這裡的Checkpoint position 其實就是cache low rba, End of redo thread就是最後一個on-disk rba。
大家都知道執行個體恢複的時候需要從cache low rba 到 on-disk rba , lowrba 與 on-disk 全部儲存在控制檔案裡面,on-diskrba 可以簡單的理解為是 lgwr 最後寫記錄檔的地址。那麼cache low rba是如何而來呢?
cache low rba 其實就是ckpt進程每3秒寫入到controlfileheader 上面的rba 。所以下面的文章將cache low rba 命名為ckpt rba 。
大家知道 ckpt 分為三種,即 database check points ,Tablespace and datafile checkpoints和Incremental checkpoints。這裡和第三種checkpoints有關。增量檢查點的存在是為了防止在發生日誌切換的時候,寫出大量的dirty block 到disk上面,它每3秒會監控一下dbwn寫出block的情況,並且寫到controlfile header裡面(不包括datafile header)。
這裡有幾點需要注意:
1. dbwn 寫出 dirtyblock 是使用一個叫做ckpt queue的雙向鏈表來維護的,按照lrba的順序寫出dirty block 到 disk 上面。
2. 每個dirty block 上面都有一個lrba ,並且有一個指向ckpt queue的指標。
3. dbwn觸發條件,請詳見concepts。
好,下面我們用實驗說話:
1. 先取出幾個塊的資料
01:57:02 dex@FAKE> select * from
01:58:10 2 (
01:58:10 3 selectdbms_rowid.rowid_relative_fno(substr(rowid,1,15)||'AAA') as file# ,
01:58:10 4 dbms_rowid.rowid_block_number(substr(rowid,1,15)||'AAA') as blk#,
01:58:10 5 max(t.id),max(t.name)
01:58:10 6 from dex.t
01:58:10 7 group by substr(rowid,1,15)
01:58:10 8 )
01:58:10 9 where rownum < 4 ;
FILE# BLK# MAX(T.ID) MAX(T.NAME)
---------- ---------- ---------- --------------------
4 446 37949 name
4 447 38433 name
4 442 39401 name
看一下x$bh
02:02:17 sys@FAKE> select dbablk ,lrba_seq,lrba_bno,flag from x$bh b where file#=4 and dbablk in (442,446,447);
DBABLK LRBA_SEQ LRBA_BNO FLAG
---------- ---------- ---------- ----------
442 0 0 524288
447 0 0 524288
446 0 0 524288
看一下當前的ckpt rba 和 ondisk rba
02:02:21 sys@FAKE> selectcplrba_seq,cplrba_bno,cplrba_bof,cpodr_seq,cpodr_bno,cpodr_bof,cphbt,cpodt fromx$kcccp where indx=0 ;
CPLRBA_SEQ CPLRBA_BNO CPLRBA_BOF CPODR_SEQ CPODR_BNO CPODR_BOF CPHBT CPODT
---------- ---------- ---------- -------------------- ---------- ---------- --------------------
37 10567 0 37 13157 0 791349660 08/15/2012 02:02:02
2. 更新資料
02:07:16 sys@FAKE> update dex.t set name='aaaa'where id=37949 ;
1 row updated.
02:10:46 sys@FAKE> update dex.t set name='ssss'where id=38433 ;
1 row updated.
02:10:46 sys@FAKE> update dex.t set name='dddd'where id=39401 ;
1 row updated.
02:10:48 sys@FAKE> commit ;
Commit complete.
3. 查看一下各種狀態
狀態為髒資料
02:10:51 sys@FAKE> select dbablk ,lrba_seq,lrba_bno,flag from x$bh b where file#=4 and dbablk in (442,446,447);
DBABLK LRBA_SEQ LRBA_BNO FLAG
---------- ---------- ---------- ----------
442 37 14429 33554433
447 37 14429 33554433
446 37 14429 33554433
現在的ckpt rba 為14104
02:10:56 sys@FAKE> selectcplrba_seq,cplrba_bno,cplrba_bof,cpodr_seq,cpodr_bno,cpodr_bof,cphbt,cpodt fromx$kcccp where indx=0 ;
CPLRBA_SEQ CPLRBA_BNO CPLRBA_BOF CPODR_SEQ CPODR_BNO CPODR_BOF CPHBT CPODT
---------- ---------- ---------- -------------------- ---------- ---------- --------------------
37 14104 0 37 14437 0 791349830 08/15/2012 02:10:51