如何分解rdba位址

2021-08-25 01:47:00 字數 3198 閱讀 2178

puber晶晶的一篇文章

介紹了assm尋找free block的過程其中在轉儲l3塊的時候,在檔案中有這樣一項

l2 hint for inserts: 0x010002e2

這是尋找l2塊的線索,但是這是乙個rdba位址,我們如何從這個塊位址中知道file_id和block_id呢?進而進一步轉儲研究呢?

還得先複習一下rowid的知識:

------------------------------------------

我們都知道rowid表示一行的實體地址,一行唯一確定乙個rowid,並且在使用中一般不會改變,除非rowid之後在行的物理位置發生改變的情況下才會發生變化。需要注意的是rowid並不會真正存在於表的data block中,但是他會存在於index當中,用來通過rowid來尋找表中的行資料。

oracle8以前乙個rowid占用6個位元組大小的儲存空間(10bit file#+22bit block#+16bit row#),那麼oracle 8以後這個rowid的儲存空間擴大到了10個位元組(32bit object#+10bit rfile#+22bit block#+16bit row#),所以資料庫中資料庫檔案個數的限制從整個資料庫最多只能有的2^10-1個資料檔案,變為了每個表空間中可以最多有2^10-1個資料檔案。(需要注意的是:local index中儲存的rowid是6個位元組,而global index中儲存的rowid是10個位元組)

那麼增加的32bit object#這個字首主要就是用來定位表空間的,同時這個object#其實對應的就是data_object_id,由於乙個段物件只能屬於乙個表空間,同時data_object_id就是標識了乙個段的物理儲存id.因此object#+rfile#就可以唯一定位當前的rowid是在那個資料檔案上了。

我們可以通過dbms_rowid這個包來轉換我們的rowid成不同組成部分

dbms_rowid.rowid_object(rowid)---> 32bit object#

dbms_rowid.rowid_relative_fno(rowid)---> 10bit rfile#

dbms_rowid.rowid_block_number(rowid)---> 22bit block#

dbms_rowid.rowid_row_number(rowid)---> 16bit row#

那麼理解了rowid的組成,我們就很容易的理解rdba的計算了

其實rdba就是rowid中的rfile#+block#

對於0x010002e2這個位址,由於他是乙個16進製制的數字串,轉換為10進製就是16777954

這個時候我們就可以通過dbms_utility這個包來進而分解我們的rdba位址

sql>select dbms_utility.data_block_address_file(16777954) "file",dbms_utility.data_block_address_block(16777954) "block"

2 from dual;

file block

---------- ----------

4 738

這樣我們在根據這條記錄的內容來轉儲l2塊資訊:

alter system dump datafile 4 block 738

基本上就是這樣。

附:rdba: 0x004062ba (1/25274)

我們通過這個例子介紹一下.

rdba從oracle6->oracle7->oracle8發生了三次改變:

在oracle6中,rdba由6位2進製數表示,也就是說資料塊最多只能有2^6=64個資料檔案(去掉全0和全1, 實際上最多只能代表62個檔案),在oracle7中,rdba中的檔案號增加為10位,為了向後相容,從block號的高位拿出4位作為檔案號的高位.這樣從6->7的rowid無需發生變化.

而資料檔案的個數理論上則擴充套件到了1022個(去掉全0和全1),在oracle7中,rowid格式為:bbbbbbbb.rrrr.ffff 在oracle8中,檔案號仍然用10位表示,只是不再需要置換,為了向後相容,同時引入了相對檔案號(rfile#),所以從oracle7到oracle8,rowid仍然無需發生變化.

在oracle8i中,oracle引入了dataobj#,rowid的格式為:oooooofffbbbbbbsss,oracle通過dataobj#進一步向上定為表空間等,從而使每個表空間的資料檔案數量理論上可以達到1022個

舉例說明如下:

在oracle6中:

比如: file 8, block 56892

26位block號==56892

vv vvvvvvvv vvvvvvvv vvvvvvvv

00100000 00000000 11011110 00111100

^^^^^^

6位檔案號==8

在oracle7中:

比如:file 255, block 56892

11111100 11000000 11011110 00111100

f c c 0 d e 3 c

\_____/\___/\_______________________/

| | |

| | block = 0xde3c = 56892

\_____________

| \

v v

0011 111111 = 0xff = 255 --注意這裡高位和低位要置換才能得出正確的file#

在oracle8中:

比如:file 255, block 56892

11111100 11000000 11011110 00111100

f c c 0 d e 3 c

\_____/\___/\_______________________/

| | |

| | block = 0xde3c = 56892

\_____________

| \

v v

0011 1111 0011 = 03f3 = 1011 --這就是相對檔案號

對於我們測試中的例子:

rdba: 0x004062ba (1/25274)

也就是:0000 0000 0100 0000 0110 0010 1011 1010

前10位為rfile#: 0000 0000 01 = 1

後22位為block#:00 0000 0110 0010 1011 1010 = 25274

js分解RTMP的url位址

因為產品需要,要求前端網頁可以自動分解客戶填寫的rtmp的url位址,在與底層互動時,將分解好的字段傳給底層,不能直接傳完整的url,所以自己寫了乙個方法來分解rtmp的url位址。標準的rtmp的url由以下部分組成 rtmp rtmp rtmp 第一種為最為普遍的url位址,是普通使用者的標準訪...

使用js分解url位址引數

使用split函式分別分割,先以 分割,再以 最後再以 並將之存入乙個物件 分解 分割線 關於上述的載入的jquery檔案,有integrity屬性和crossorigin 屬性?那麼他們都分別代表什麼呢?它相當於是用來校驗載入的cdn檔案是否被人篡改了。通過比對兩次的簽名,如果被人篡改了 比如說,...

如何分解質因數

輸入乙個正整數repeat 0 repeat 10 做repeat次下列運算 輸入乙個正整數 m 1 m 1000 將 m 分解質因數。輸出使用以下語句 printf d i 輸入輸出示例 括號內為說明 輸入3 repeat 3 2 m 2 8 m 8 90 m 90 輸出2 2 8 2 2 2 9...