當ASM創建一個文件時(例如數據庫實例要求創建一個數據文件),它會以extent為單位分配空間。一旦文件被創建,ASM會傳遞extent映射表給數據庫實例,后續數據庫實例能在不和ASM實例交互的情況下訪問這個文件。如果一個文件的extent需要被重新定位,比如磁盤組進行rebalance操作,ASM會告知數據庫實例關于extent映射表的變更。
可以通過查詢ASM實例的X$KFFXP視圖來獲取ASM文件extent映射表的內容。X$KFFXP視圖中的每一行對應著所有處于mount狀態磁盤組中每一個文件的每一個物理extent的信息。
譯者注:1)網絡上有不少關于X$KFFXP視圖的解釋,有些信息過于陳舊,需要指出,它記錄的每一條記錄都代表的是物理extent的信息,而非AU信息,X$KFFXP視圖的SIZE_KFFXP字段,代表了此extent是由幾個AU組成的,在啟用11G可變extent特性后會出現SIZE_KFFXP大于1的情況,具體更多信息參考本系列的篇文章。2)X$KFFXP這里翻譯成了X$KFFXP視圖,只是為了便于理解,它的本質是一個內存的數據結構(fixed table),其數據不在buffer_cache中。
X$KFFXP視圖的重要字段包括:
GROUP_KFFXP磁盤組編號。注意磁盤組編號不是恒久不變的,每次磁盤組被mount時都可能會不一樣。等同于V$ASM_DISKGROUP.GROUP_NUMBER字段。
NUMBER_KFFXP文件序號。等同于V$ASM_FILE.FILE_NUMBER字段。注意,ASM的文件序號不同于數據庫內的數據文件序號,不要把兩個概念搞混了。小于256的ASM文件序號是保留給ASM元數據文件使用的。
INCARN_KFFXP文件版本號。當一個ASM文件序號被一個新文件重用時,文件版本號會發生改變。等同于V$ASM_FILE.INCARNATION字段。注意,ASM文件是以文件序號.版本號的方式結尾。
XNUM_KFFXP虛擬extent序號。external冗余磁盤組的虛擬extent序號與物理extent序號一致。normal冗余磁盤組的虛擬extent序號通過將物理extent序號除于2得到.high冗余磁盤組的虛擬extent序號通過將物理extent序號除于3得到。
PXN_KFFXP物理extent序號。一個文件的物理extent序號都以數字0開始,順序遞增。
LXN_KFFXP虛擬extent中物理extent的序號。0為primary extent,1為secondary extent,2為third copy of the extent。
DISK_KFFXP物理磁盤序號。等同于V$ASM_DISK.DISK_NUMBER。
AU_KFFXP AU序號。磁盤維度的AU編號,每個磁盤從0開始。
在ASM實例中通過以下查詢,能夠看出磁盤組3內的ASM元數據文件的文件序號,名字和AU數量。
$ sqlplus / as sysasm
SQL> select NUMBER_KFFXP "ASM file number", DECODE (NUMBER_KFFXP, 1, 'File directory', 2, 'Disk directory', 3, 'Active change directory', 4, 'Continuing operations directory', 5, 'Template directory', 6, 'Alias directory', 7, 'ADVM file directory', 8, 'Disk free space directory', 9, 'Attributes directory', 10, 'ASM User directory', 11, 'ASM user group directory', 12, 'Staleness directory', 253, 'spfile for ASM instance', 254, 'Stale bit map space registry ', 255, 'Oracle Cluster Repository registry') "ASM metadata file name",
count(AU_KFFXP) "Allocation units" from X$KFFXP
where GROUP_KFFXP=3 and NUMBER_KFFXP<256 group by NUMBER_KFFXP
order by 1;
ASM file number ASM metadata file name Allocation units --------------- ---------------------------------- ---------------- 1 File directory 3 2 Disk directory 3 3 Active change directory 69 4 Continuing operations directory 6 5 Template directory 3 6 Alias directory 3 8 Disk free space directory 3 9 Attributes directory 3 12 Staleness directory 3 253 spfile for ASM instance 2 254 Stale bit map space registry 3 255 Oracle Cluster Repository registry 135 12 rows selected.
SQL>
通過以上查詢結果可以發現,這個磁盤組并沒有包含所有類型的元數據文件(例如第十號和第十一號文件)。一個有意思的事情是,除了ASM實例的spfile,每個文件至少占用3個AU,對于這一點更多詳細信息我們會在其他章節介紹。
我們再來以一個數據庫控制文件為例查看下它的extent映射表。
第1步,查找DATA磁盤組內所有的數據庫控制文件(以Grid所屬的OS用戶身份運行asmcmd命令)
$ asmcmd find --type controlfile +DATA "*" +DATA/DBM/CONTROLFILE/Current.256.738247649 +DATA/BR/CONTROLFILE/Current.299.748434267 $
第2步,檢查DATA磁盤組的磁盤組序號(連接到ASM實例)
$ sqlplus / as sysasm
SQL> select GROUP_NUMBER from V$ASM_DISKGROUP where NAME='DATA'; GROUP_NUMBER
------------ 1
SQL>
第3步,檢查磁盤組1中ASM 256號文件(+DATA/DBM/CONTROLFILE/Current.256.738247649)的extent映射表
SQL> select XNUM_KFFXP "Virtual extent", PXN_KFFXP "Physical extent", LXN_KFFXP "Extent copy", DISK_KFFXP "Disk", AU_KFFXP "Allocation unit" from X$KFFXP
where GROUP_KFFXP=1 and NUMBER_KFFXP=256 and XNUM_KFFXP<>2147483648 order by 1,2;
Virtual extent Physical extent Extent copy Disk Allocation unit
-------------- --------------- ----------- ---------- --------------- 0 0 0 20 5 0 1 1 29 1903 0 2 2 6 82 1 3 0 22 6 1 4 1 31 8 1 5 2 9 3 2 6 0 30 8 2 7 1 23 1907 2 8 2 7 63 3 9 0 26 2 3 10 1 16 1904 3 11 2 6 4 ... 39 117 0 25 1913 39 118 1 15 1906 39 119 2 3 27 120 rows selected.
SQL>
以上輸出可以看出這個控制文件是三路鏡像,每個虛擬extent對應三個物理extent,還可以看出這個文件每個AU的實際位置。
本站文章版權歸原作者及原出處所有 。內容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構成任何投資及應用建議。本站是一個個人學習交流的平臺,網站上部分文章為轉載,并不用于任何商業目的,我們已經盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯系我們,我們將根據著作權人的要求,立即更正或者刪除有關內容。本站擁有對此聲明的最終解釋權。