由Rdba发现 block地址(使用dbms_utility)
本文转载(eygle)
http://www.eygle.com/archives/2006/09/how_to_use_dbms_utility.html
一、问题
Start dump data blocks tsn: 9 file#: 6 minblk 20 maxblk 20
buffer tsn: 9 rdba: 0x01800014 (6/20)
scn: 0x0000.001e917f seq: 0x01 flg: 0x00 tail: 0x917f0601
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
我们的trc文件包含rdba,如何把rdba转换成文件号和数据块号呢?
二、答案
Oracle提供了一个系统包dbms_utility可以进行转换
doudou@TEST> variable file# number
doudou@TEST> variable block# number
doudou@TEST> execute :file#:=dbms_utility.data_block_address_file(to_number('1800014','xxxxxxxxx'));
PL/SQL procedure successfully completed.
doudou@TEST> execute :block#:=dbms_utility.data_block_address_block(to_number('1800014','xxxxxxxxx'));
PL/SQL procedure successfully completed.
doudou@TEST> print file#
FILE#
----------
6
doudou@TEST> print block#
BLOCK#
----------
20
由rdba:0x01800014我们已经找到了 file 6 block 20 。(1800014为16进制部分记录了file位置和block位置)
总结:trc文件中有很多我们不知道的奥秘,可以让我们发现更多的内在问题。期待了解更多!
三、附表:
其实我们上面使用dbms_utility存在一个16进制到10机制的转换(下面简单介绍一下函数转换的使用)
1、 使用to_number函数(16进制转换到10进制)
doudou@TEST> select to_number('1800014','x') from dual;
select to_number('1800014','x') from dual
*
ERROR at line 1:
ORA-01722: invalid number
【这里的X限制了显示的位数,不足的时候会报错,这里我们可以给很多个X避免报错】
doudou@TEST> select to_number('1800014','xxxxxxxxxxxxx') from dual;
TO_NUMBER('1800014','XXXXXXXXXXXXX')
------------------------------------
25165844
2、 使用to_char函数(10进制转换16进制)
doudou@TEST> select to_char(25165844,'xxxxxxxxxxxx') from dual;
TO_CHAR(25165844,'XXXXXXXX
--------------------------
1800014
3、使用bin_to_num函数(2进制转换10进制)
doudou@TEST> select bin_to_num(0,0,0,1) from dual;
BIN_TO_NUM(0,0,0,1)
-------------------
1
doudou@TEST> select bin_to_num(0,0,1,0) from dual;
BIN_TO_NUM(0,0,1,0)
-------------------
2