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...