使用DBMS_UTILITY轉換Block地址
2024-07-21 02:32:48
供稿:網友
很多時候,我們可以從Oracle的Trace文件中獲得Block的DBA(Data Block Address),有時候需要對這個地址進行轉換才能得到相應的Block地址。有的trace文件中已經包含了地址轉換,例如: Start dump data blocks tsn: 4 file#: 4 minblk 465 maxblk 465
buffer tsn: 4 rdba: 0x010001d1 (4/465)而有時候trace文件里只包含一個RDBA,比如上周我們碰到的一個案例:oer 8102.2 - obj# 111465, rdba: 0x08811ba3
kdk key 8102.2:
ncol: 2, len: 15
key: (15): 07 78 6a 08 1f 01 14 15 06 06 00 00 06 00 73
mask: (4096):這里的Rdba我們怎樣才能轉換為文件號和數據塊號呢?通過手工轉換,可以參考如下文章:http://www.eygle.com/archives/2004/08/how_to_convert_rdba.HtmlOracle同時提供一個系統包 dbms_utility 可以用于對RDBA進行轉換。注重,對于上面的 rdba: 0x08811ba3,首先要做一個16進制到10進制的轉換,轉換方法參考: http://www.eygle.com/archives/2004/06/oracle_howto_convert.html下面我們使用dbms_utility 來進行轉換:SQL> variable file# number
SQL> variable block# number
SQL> execute :file#:=dbms_utility.data_block_address_file(to_number('8811ba3','xxxxxxx'));PL/SQL PRocedure sUCcessfully completed.SQL> execute :block#:=dbms_utility.data_block_address_block(to_number('8811ba3','xxxxxxx'));PL/SQL procedure successfully completed.SQL> print file# FILE#
----------
34SQL> print block# BLOCK#
----------
72611這樣就可以通過dba_extents獲得相關對象信息。當然這里oer 8102.2 的信息已經告訴我們,出問題的是一個索引: $ oerr ora 8102
08102, 00000, "index key not found, obj# %s, dba %s (%s)"
// *Cause: Internal error: possible inconsistency in index
// *Action: Send trace file to your customer support representative, along
// with information on reproducing the error-The End-