今天来和大家简单谈一下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.0010seq#=0x000024=36blk#=0x000011bd=4541ofs#=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 * from01: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.t01: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$bh02: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 rba02: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 为1410402: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
Oracle文件缺失导致打开失败的解决方法如何配置Oracle客户端以及sys系统超级管理员无法登录的问题相关资讯 Oracle基础
- Oracle基础介绍及常用相关SQL*PLUS (03月11日)
- Oracle 角色的两个特性和误区 (09/04/2012 05:56:16)
- Oracle rac11.2.0.3.0的vip在重启 (09/02/2012 10:00:39)
| - Oracle中删除用户遇到的问题 (09/08/2012 20:01:42)
- IMP-00008: unrecognized (09/02/2012 10:03:25)
- 在Oracle数据库上设置限制ip地址访 (09/02/2012 09:59:55)
|
本文评论 查看全部评论 (0)