天天看點

資料庫頁面結構——Oracle篇(四)

上篇我在oracle中建立了一個簡單的資料表,并在資料表中插入了兩條記錄。通過檢視rowid找到了這些插入的資料所在的對象編号、檔案編号、頁面編号和項編号,再根據頁面在檔案上的頁面編号算出了資料在檔案上的偏移,然後根據檔案編号在系統表上找到資料檔案所在的路徑,最後将這些資料所在的頁面定位了出來。下面我對這些資料根據頁面結構做了一個簡單的劃分,每個部分都在圖上做了标記,先看看整體情況,後面再詳細的介紹每一個部分。

資料庫頁面結構——Oracle篇(四)

由上圖可以看到頁面資料總共分成了五個部分,下面詳細的介紹每一部分的資料的含義。

page common header

資料庫頁面結構——Oracle篇(四)

type::頁面類型,主要包括資料頁面、索引頁面等,資料頁面的類型為6

format:oracle 8,oracle 8i和oracle 9i,此值都為0x02,oracle 12c此值為0xa2

filler:這兩個位元組暫時沒有使用

rdba:此資料的低22位為頁面偏移,高10位為檔案編号,是以對于目前值0x00418721來說,0x018721為頁面偏移(十進制位100129,正好就是上一篇查到的頁面id),檔案編号為0x0001(即檔案編号是1)

scn:這個就不用多解釋了,熟悉oracle的人都比較清楚

seq:每一次修改都會将此值加1,也就是頁面的修改次數

flag:會有四個值,0x01表示新頁面,會将空閑資料區域清空;0x02修改scn和seq的時候延遲記錄日志;0x04正常情況都是這個類型;0x08表示臨時頁面。

check sum:頁面校驗碼,如果頁面校驗關閉的話,這個值為0x0000

transaction layer

資料庫頁面結構——Oracle篇(四)

事務層比較複雜,有幾個屬性需要專門構造資料才能搞明白其含義,我偷懶就隻介紹我知道的部分好了。

type:0x01表示資料頁面

object id:此值也可以從rowid中擷取到,這裡可以看到此值占用了四個位元組,值為:0x0001677a(十進制的92062),可以從上一篇看到objectid正好就是此值。

cleanout scn:是資料檔案cleanout時寫入的scn。

itc:事務表項數,一個位元組表示

itl(interested transaction list):一項占用24個位元組,具體下面再進一步解釋,第二項因為還沒有被用過,是以值全是0,如果同時有兩個事務操作此頁面才會用到itl2

itl還是一個結構體,具體值如下所示:

xid:0x00d0.002.000000805,目前事務id,xid的三個部分分别表示undo段号、undo項号以及undo對應槽号被覆寫的次數

undo address:0x01400fff.3200.f3,uba也分為三個部分,分别表示undo dba、seq no和record no

flag:0x02表示commit upper bound,另外還有兩個含義commited和active at csc,用dump工具dump出來以後分别用u、c和t顯示

lock:目前事務影響的行數

table and row directory

資料庫頁面結構——Oracle篇(四)

table count:表目錄的個數,普通表都是0x01

pti:表示表目錄項的值,0x0000表示第一個表的項目錄從0開始

nrows:表示此頁面上的有效行數

frre:表示第一個空閑項的位置,如果為0xffff表示沒有

fsbo:表示空閑空間的起始位置

fseo:表示空閑空間的結束位置

avsp:頁面立即可用空間大小

tosp:頁面上的總的可用空間大小

slot num:表示頁面上的項數目

slot offset:表示頁面上每個項的偏移

這些屬性中,容易産生疑惑的可能是avsp和tosp,這裡留一個問題,為什麼會有兩個屬性都記錄可用空間大小?

tail

資料庫頁面結構——Oracle篇(四)

tail部分占用四個位元組,總共分為三部分,分别是頁面type,頁面的seq和頁面scn base的低兩個位元組。

oracle頁面相關内容就分析到這裡,對于頁面動态的變化,先不介紹了,以後還會繼續介紹。

<b></b>

<b>本文來自雲栖社群合作夥伴“dbgeek”</b>