有时候为了检查物理备库是否正常,我们一般open read only 打开,然后去查询一些对象。这个比较直观,然后如果想知道某些datafile是否正常,可以查询对应file上的对象(当然还有一些常规方法dbv、VALIDATE DATAFILE),那怎么知道datafile 与 object的关系呢,通过 v$bh可以大概看出来:
通过v$bh得到一些object:
SQL> select file#,block#,class#,status,xnc,objd from v$bh where ts#=6 and file#=53;
FILE# BLOCK# CLASS# STATUS XNC OBJD
---------- ---------- ---------- ---------- ---------- ----------
53 29073 0 free 0 20798
53 14928 0 free 0 22287
53 22151 0 free 0 23840
53 14352 0 free 0 22287
53 16216 0 free 0 22287
53 17936 0 free 0 22287
53 31882 0 free 0 24140
53 32581 0 free 0 24140
53 16627 0 free 0 22287
53 10370 0 free 0 22287
53 22774 0 free 0 23840
165 rows selected.
通过dump block得到一些具体的对象记录:
alter system dump datafile 53 block 14352;
seg/obj: 0x570f csc: 0x0f.6c721bd0 itc: 2 flg: E typ: 1 - DATA ----> 0x570f 转为十进制为 22287
brn: 0 bdba: 0xd402883 ver: 0x01 opc: 0
inc: 0 exflg: 0
tab 0, row 0, @0x1f29
tl: 111 fb: --H-FL-- lb: 0x0 cc: 10
col 0: [ 2] c1 02
col 1: [ 5] c4 07 24 24 0f
col 2: [ 5] c4 13 60 37 63
还原dump数据(可参考http://space.itpub.net/758322/viewspace-751219 oracle 数据类型转换)
SQL> declare n number;
2 begin
3 dbms_stats.convert_raw_value('c40724240f',n);
4 dbms_output.put_line(n);
5 end;
6 /
6353514
PL/SQL procedure successfully completed
SQL>
SQL> declare n number;
2 begin
3 dbms_stats.convert_raw_value('c413603763',n);
4 dbms_output.put_line(n);
5 end;
6 /
18955498
PL/SQL procedure successfully completed
验证,可通过相应记录的rowid转换得到:
SQL> select object_name from dba_objects where object_id=22287;
OBJECT_NAME
--------------------------------------------------------------------------------
AAAAAA
SQL> select dbms_rowid.rowid_object(rowid) obj,
2 dbms_rowid.rowid_relative_fno(rowid) "file"
3 from AAAAAA a
4 where a.product_id = 6353514
5 and a.pic_id = 18955498;
OBJ file
---------- ----------
22287 53