由 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:
0x0
1800014
(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: 0x0 1800014 我们已经找到了 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
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26442936/viewspace-750992/ ,如需转载,请注明出处,否则将追究法律责任。