本章講述ASM的5號文件,5號文件是ASM的模板目錄,包含了磁盤組中所有的文件模板的信息。
有兩種類型的模板:一種是系統自帶的,一種是用戶創建的,默認的模板(系統自帶的)已經包含ASM的所有文件類型,創建文件時會根據文件類型自動匹配,用戶創建的模板只會在用戶特別指定時使用。
每一個模板包含了如下的一些信息:
可以通過視圖V$ASM_TEMPLATE來查看完整的模板信息,這里查看下我系統上的模板:
SQL> SELECT name "Template Name", redundancy "Redundancy", stripe "Striping", system "System" FROM v$asm_template WHERE group_number=1;
Template Name Redundancy Striping System ------------------------ ---------------- ---------------- -------- PARAMETERFILE MIRROR COARSE Y
ASMPARAMETERFILE MIRROR COARSE Y
DUMPSET MIRROR COARSE Y
CONTROLFILE HIGH FINE Y
FLASHFILE MIRROR COARSE Y
ARCHIVELOG MIRROR COARSE Y
ONLINELOG MIRROR COARSE Y
DATAFILE MIRROR COARSE Y
TEMPFILE MIRROR COARSE Y
BACKUPSET MIRROR COARSE Y
AUTOBACKUP MIRROR COARSE Y
XTRANSPORT MIRROR COARSE Y
CHANGETRACKING MIRROR COARSE Y
FLASHBACK MIRROR COARSE Y
DATAGUARDCONFIG MIRROR COARSE Y
OCRFILE MIRROR COARSE Y 16 rows selected.
有一個模板非常的顯眼,那就是控制文件(3重鏡像,細粒度條帶),這是默認的數據庫控制文件的模板,這是為什么每一個控制文件都會被做三重鏡像的原因。有趣的是,我們可以使用它創建任何數據庫文件。
這里舉一個例子(注意我連接的是數據庫的實例):
SQL> create tablespace TRIPLE_F datafile '+DATA(CONTROLFILE)' size 1m; Tablespace created.
SQL> SELECT name FROM v$datafile WHERE name like '%triple_f%'; NAME
-------------------------------------------------------------------------------- +DATA/br/datafile/triple_f.271.771793293
上面創建了一個表空間,ASM給我新創建的數據文件分配了編號217,我們接著看這個文件的冗余度,這一次我連接的是ASM的實例:
SQL> SELECT group_number, name, type "Redundancy" FROM v$asm_diskgroup WHERE name='DATA';
GROUP_NUMBER NAME Redundancy ------------ -------------------------------- ---------------- 1 DATA NORMAL
這是一個normal冗余的磁盤組,但是由于我們使用了控制文件模板來創建數據文件,因此我們通過查詢內部視圖x$kffxp來獲得我們想要的信息:
SQL> SELECT xnum_kffxp "Extent", au_kffxp "AU", disk_kffxp "Disk" FROM x$kffxp
WHERE group_kffxp=1 and number_kffxp=271 ORDER BY 1,2;
Extent AU Disk
---------- ---------- ---------- 0 1126 1 0 1130 3 0 1136 2 1 1131 3 1 1132 0 1 1137 2 ... 7 1132 1 7 1135 3 7 1141 2 24 rows selected.
如預期,這個文件被做了三重鏡像,因為我們看到每一個虛擬區都由三個物理區組成,但是為什么我的數據文件僅僅只有1MB,但是卻有8個虛擬區呢,這是因為控制文件的模板是一個精細條帶的模板。
譯者注:隱含參數
_asm_stripesize代表了精細條帶的大小,默認為128K,隱含參數_asm_stripewidth代表了條帶的寬度,默認為8。但是有一點很奇怪,精細條帶下,數據文件頭好像沒有獨占一個extent,因為上面查詢顯示了這個1MB的文件一共占用了8個extent,而不是9個extent,按照條帶寬度是8的設定,文件內容本身就應該占用了8個extent。
如果我想要文件具有三重鏡像但是粗粒度的條帶,該怎么做?我們可以手工創建一個我們自己的模板,COARSE關鍵字指定了這是一個粗粒度的條帶:
SQL> alter diskgroup DATA add template TRIPLE_COARSE attributes (HIGH COARSE); Diskgroup altered.
Let's now use this template. Back to the database instance...
SQL> create tablespace TRIPLE_C datafile '+DATA(TRIPLE_COARSE)' size 1m;
Tablespace created.
SQL> SELECT name FROM v$datafile WHERE name like '%triple_c%'; NAME
-------------------------------------------------------------------------------- +DATA/br/datafile/triple_c.272.771794469
ASM的文件號是272,返回到ASM實例檢查:
SQL> SELECT xnum_kffxp "Extent", au_kffxp "AU", disk_kffxp "Disk" FROM x$kffxp WHERE group_kffxp=1 and number_kffxp=272 ORDER BY 1,2;
Extent AU Disk ---------- ---------- ---------- 0 1136 3 0 1137 0 0 1142 2 1 1133 1 1 1137 3 1 1143 2 6 rows selected.
這次的結果顯示了只為1MB的文件分配了1個虛擬區,額外的一個是ASM的文件頭。注意這個文件是三重的鏡像和粗粒度的條帶。
我也可以創建一個根本不做鏡像的模板,我們試試看:
SQL> alter diskgroup DATA add template NO_MIRRORING attributes (UNPROTECTED);
Diskgroup altered.
接下來我們使用我們上面創建的模板來添加一個數據文件:
SQL> create tablespace NOT_IMPORTANT datafile '+DATA(NO_MIRRORING)' size 1m;
Tablespace created.
SQL> SELECT name FROM v$datafile WHERE name like '%not_important%'; NAME
-------------------------------------------------------------------------------- +DATA/br/datafile/not_important.273.771795255
上面新產生的數據文件的編號是273,我們來檢查一下:
SQL> SELECT xnum_kffxp "Extent", au_kffxp "AU", disk_kffxp "Disk" FROM x$kffxp WHERE group_kffxp=1 and number_kffxp=273 ORDER BY 1,2;
Extent AU Disk
---------- ---------- ---------- 0 1138 0 1 1134 1
我們看到這個文件沒有被鏡像(雖然在一個normal冗余的磁盤組中)。
模板目錄包含了磁盤組中文件模板的信息,每一個磁盤組都會有默認的一系列的系統自帶的模板,用戶也可以額外根據需要創建自己的模板。一個比較好的使用模板的方法是在一個normal冗余的磁盤中創建一個三重鏡像模板,注意如果想要使這個做法生效,我們至少需要這個磁盤組中有3個failgroup。
本站文章版權歸原作者及原出處所有 。內容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構成任何投資及應用建議。本站是一個個人學習交流的平臺,網站上部分文章為轉載,并不用于任何商業目的,我們已經盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯系我們,我們將根據著作權人的要求,立即更正或者刪除有關內容。本站擁有對此聲明的最終解釋權。