由Rdba发现 block地址(使用dbms_utility)【转载eygle文章】

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 。(180001416进制部分记录了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

你可能感兴趣的:(由Rdba发现 block地址(使用dbms_utility)【转载eygle文章】)