ASM 翻譯系列第四十彈:理解ASM中 REQUIRED_MIRROR_FREE_MB和USABLE_FILE_MB的含義
原作者:Harald van Breederode
譯者: 魏興華
稽核: 魏興華
DBGeeK社群聯合出品
原文連結:https://prutser.wordpress.com/2013/01/03/demystifying-asm-required_mirror_free_mb-and-usable_file_mb/
在我的課上一個經常被問到的問題是ASM如何計算磁碟組REQUIRED_MIRROR_FREE_MB和USABLE_FILE_MB的值,這個問題的答案跟很多複雜問題的答案一樣:要看情況。
簡單來說,檢視V$ASM_DISKGROUP中的REQUIRED_MIRROR_FREE_MB值代表瞭如果ASM磁碟或ASM磁碟組出現了故障,要重新滿足冗餘度的定義,要求有多少的空閒空間。USABLE_FILE_MB的值代表了在滿足冗餘度之後,還有多少的剩餘空間可以用。
問題是:ASM怎麼計算出這些值的?
問題的答案可以通過建立一些不同配置的磁碟組,然後觀察檢視V$ASM_DISKGROUP中的REQUIRED_MIRROR_FREE_MB 和 USABLE_FILE_MB。為了找到答案,我們僅僅只需要一些磁碟而已。
ASM> select label,os_mb from v$asm_disk 2 where label like 'SAN%' order by label; LABEL OS_MB ------------------------------- ---------- SAN01 255 SAN02 255 SAN03 255 SAN04 255 SAN05 255 SAN06 255
REQUIRED_MIRROR_FREE_MB and USABLE_FILE_MB in external redundancy disk groups
我們先從建立一個外部冗餘的磁碟組開始,這裡使用到了我們上面列出的6塊盤,每個盤的大小是255MB:
ASM> create diskgroup demo external redundancy 2 disk 'ORCL:san01' 3 disk 'ORCL:san02' 4 disk 'ORCL:san03' 5 disk 'ORCL:san04' 6 disk 'ORCL:san05' 7 disk 'ORCL:san06' 8 attribute 'compatible.asm' = '11.2.0.0.0'; Diskgroup created.
我們查詢檢視V$ASM_DISKGROUP中的幾個列來獲得磁碟組的相關資訊:
ASM> select name, state, type, total_mb, free_mb, REQUIRED\_MIRROR\_FREE\_MB req_free, USABLE\_FILE\_MB use_mb 2 from v$asm_diskgroup where name = 'DEMO'; NAME STATE TYPE TOTAL_MB FREE_MB REQ_FREE USE_MB ---------- ----------- ------ ---------- ------- -------- ------ DEMO MOUNTED EXTERN 1530 1468 0 1468
以上輸出顯示了磁碟組的總大小為1530MB(TOTAL_MB),其中1468MB(FREE_MB)是空閒的空間,由於這是一個外部冗餘的磁碟組,因此所有的空閒空間都可以用來存放檔案,USABLE_FILE_MB列的值也顯示了這一點,REQUIRED_MIRROR_FREE_MB的值為0。
注意:缺少的62MB被使用來存放ASM的後設資料。
REQUIRED_MIRROR_FREE_MB and USABLE_FILE_MB in normal redundancy disk groups
接下來我們建立一個normal冗餘的磁碟組,磁碟組共有6塊磁碟,每一個盤是一個獨立的failgroup。
ASM> create diskgroup demo normal redundancy 2 failgroup FG1 disk 3 'ORCL:san01' 4 failgroup FG2 disk 5 'ORCL:san02' 6 failgroup FG3 disk 7 'ORCL:san03' 8 failgroup FG4 disk 9 'ORCL:san04' 10 failgroup FG5 disk 11 'ORCL:san05' 12 failgroup FG6 disk 13 'ORCL:san06' 14 attribute 'compatible.asm' = '11.2.0.0.0'; Diskgroup created.
ASM在磁碟組內使用failgroup來提供資料的映象和冗餘,資料被儲存在一個failgroup的同時,會自另外的failgroup中儲存相同的資料副本,以此來保障資料的安全,在一個normal冗餘的磁碟組中,一個failgroup出現故障並不會影響整個磁碟組的可用性,ASM還可以根據映象資料讓磁碟組重新達到normal冗餘的要求,但是為了能做到這一點,需要磁碟組有足夠的剩餘空間,因此一個failgroup實際有多大就顯得非常的重要。
ASM> select failgroup,sum(total_mb) from v$asm_disk 2 where label like 'SAN%' group by failgroup order by failgroup; FAILGROUP SUM(TOTAL_MB) ------------------------------ ------------- FG1 255 FG2 255 FG3 255 FG4 255 FG5 255 FG6 255
上面輸出顯示每一個failgroup的的總大小都是255MB,我們看下它如何影響剩餘空間的要求以及它如何影響可用的檔案空間。
ASM> select name, state, type, total_mb, free_mb, REQUIRED\_MIRROR\_FREE\_MB req_free, USABLE\_FILE\_MB use_mb 2 from v$asm_diskgroup where name = 'DEMO'; NAME STATE TYPE TOTAL_MB FREE_MB REQ_FREE USE_MB ---------- ----------- ------ ---------- ------- -------- ------ DEMO MOUNTED NORMAL 1530 1365 255 555
上面輸出顯示了,為了能夠在磁碟組的一個failgroup出現故障後能夠重新滿足磁碟組冗餘度的要求,需要有255MB的剩餘空間(REQUIRED_MIRROR_FREE_MB)。255這個數值是磁碟組的一個failgroup的大小,如果磁碟組裡的failgroup的大小不等,那麼ASM會自動選擇具有最大空間的failgroup。
上面的輸出也顯示了我們還可以使用555MB的空間來存放檔案,這個值是按照如下公式計算出來的:
ASM> select trunc((free_mb - REQUIRED\_MIRROR\_FREE\_MB) / 2) as useable 2 from v$asm_diskgroup where name='DEMO'; USEABLE ---------- 555
上面的公式翻譯過來就是:總的可用空間等於總的剩餘空間減去REQUIRED_MIRROR_FREE_MB後的值再除以磁碟組的冗餘度,這裡normal冗餘也就是要除以2。REQUIRED_MIRROR_FREE_MB的含義我們上面已經提到過:為了能夠在磁碟組的一個failgroup出現故障後能夠重新滿足磁碟組冗餘度的要求而需要的空間。
由於可用空間的公式中的free_mb的值是動態變化的,例如新增了檔案或檔案做了resize等操作都會影響磁碟組的剩餘空間,因此磁碟組的可用空間也是動態變化的,這一點可用通過一個簡單的例子加以說明:
SQL> create tablespace foo datafile '+DEMO' size 200m; Tablespace created. ASM> select name, state, type, total_mb, free_mb, REQUIRED\_MIRROR\_FREE\_MB req_free, USABLE\_FILE\_MB use_mb 2 from v$asm_diskgroup where name = 'DEMO'; NAME STATE TYPE TOTAL_MB FREE_MB REQ_FREE USE_MB ---------- ----------- ------ ---------- ------- -------- ------ DEMO MOUNTED NORMAL 1530 939 255 342
由於我們往磁碟組中新增加了一個200MB的資料檔案,導致了磁碟組的可用空間減少了,從555MB減少到了342MB。
SQL> alter tablespace foo add datafile '+DEMO' size 200m; Tablespace altered. ASM> select name, state, type, total_mb, free_mb, REQUIRED\_MIRROR\_FREE\_MB req_free, USABLE\_FILE\_MB use_mb 2 from v$asm_diskgroup where name = 'DEMO'; NAME STATE TYPE TOTAL_MB FREE_MB REQ_FREE USE_MB ---------- ----------- ------ ---------- ------- -------- ------ DEMO MOUNTED NORMAL 1530 534 255 139
在又新增了一個資料檔案後,如預期,可用的空間又進一步減少了,減少的空間略微的大於實際新增的檔案size,現在可用空間只剩下139MB了,我們再新增一個200MB的資料檔案會怎麼樣?
SQL> alter tablespace foo add datafile '+DEMO' size 200m; Tablespace altered.
儘管ASM顯示了僅僅只有139MB的可用空間,但是我們確實又成功的建立了一個大小為200MB的資料檔案,因此這裡需要強調,ASM並不會強制預留出REQUIRED_MIRROR_FREE_MB所指示的空間。
ASM> select name, state, type, total_mb, free_mb, REQUIRED\_MIRROR\_FREE\_MB req_free, USABLE\_FILE\_MB use_mb 2 from v$asm_diskgroup where name = 'DEMO'; NAME STATE TYPE TOTAL_MB FREE_MB REQ_FREE USE_MB ---------- ----------- ------ ---------- ------- -------- ------ DEMO MOUNTED NORMAL 1530 129 255 -63
USABLE_FILE_MB的值已經變為了負數,這意味著如果我們遭遇了故障ASM有可能會沒有足夠的剩餘空間來重新滿足冗餘度的要求,因此監控USABLE_FILE_MB的值非常的重要,如果某個磁碟組的USABLE_FILE_MB值變為了負數,你應該增加磁碟組的空間或者釋放出一些空間出來。現在我們刪除掉這個表空間看看:
SQL> drop tablespace foo; Tablespace dropped.
現在我們建立另一個normal冗餘的磁碟組,這次僅僅只建立3個failgroup,每一個failgroup包含了2個磁碟(之前建立的磁碟組包含了6個failgroup,每一個磁碟是一個failgroup):
ASM> create diskgroup demo normal redundancy 2 failgroup FG1 disk 3 'ORCL:san01', 4 'ORCL:san02' 5 failgroup FG2 disk 6 'ORCL:san03', 7 'ORCL:san04' 8 failgroup FG3 disk 9 'ORCL:san05', 10 'ORCL:san06' 11 attribute 'compatible.asm' = '11.2.0.0.0'; Diskgroup created.
在磁碟組成功建立後,我們再來看下failgroup的大小:
ASM> select failgroup,sum(total_mb) from v$asm_disk 2 where label like 'SAN%' group by failgroup order by failgroup; FAILGROUP SUM(TOTAL_MB) ------------------------------ ------------- FG1 510 FG2 510 FG3 510
三個failgroup的大小都是510MB,我們再來看下檢視V$ASM_DISKGROUP中相關列的情況:
ASM> select name, state, type, total_mb, free_mb, REQUIRED\_MIRROR\_FREE\_MB req_free, USABLE\_FILE\_MB use_mb 2 from v$asm_diskgroup where name = 'DEMO'; NAME STATE TYPE TOTAL_MB FREE_MB REQ_FREE USE_MB ---------- ----------- ------ ---------- ------- -------- ------ DEMO MOUNTED NORMAL 1530 1365 510 427
跟預期一樣,REQUIRED_MIRROR_FREE_MB的值為510,等於磁碟組中最大的failgroup的大小,USABLE_FILE_MB的值為427,就像之前已經提到過的,它的值根據以下公式計算而來:
ASM> select trunc((free_mb - REQUIRED\_MIRROR\_FREE\_MB) / 2) as useable 2 from v$asm_diskgroup where name='DEMO'; USEABLE ---------- 427
接下來,我們繼續建立一個normal冗餘的磁碟組,這一次只有2個failgroup,每個failgroup中有3個磁碟:
ASM> create diskgroup demo normal redundancy 2 failgroup FG1 disk 3 'ORCL:san01', 4 'ORCL:san02', 5 'ORCL:san03' 6 failgroup FG2 disk 7 'ORCL:san04', 8 'ORCL:san05', 9 'ORCL:san06' 10 attribute 'compatible.asm' = '11.2.0.0.0'; Diskgroup created.
同樣,我們看下磁碟組中每一個failgroup的大小:
ASM> select failgroup,sum(total_mb) from v$asm_disk 2 where label like 'SAN%' group by failgroup order by failgroup; FAILGROUP SUM(TOTAL_MB) ------------------------------ ------------- FG1 765 FG2 765
兩個failgroup的大小都等於765MB,同樣檢視檢視v$asm_diskgroup相關欄位的值:
ASM> select name, state, type, total_mb, free_mb, REQUIRED\_MIRROR\_FREE\_MB req_free, USABLE\_FILE\_MB use_mb 2 from v$asm_diskgroup where name = 'DEMO'; NAME STATE TYPE TOTAL_MB FREE_MB REQ_FREE USE_MB ---------- ----------- ------ ---------- ------- -------- ------ DEMO MOUNTED NORMAL 1530 1416 255 580
這次的結果有點出乎意料,REQUIRED_MIRROR_FREE_MB的值僅僅只有255MB,而不是765MB(failgroup的大小),顯然,ASM只一次只是給了一個磁碟的大小作為REQUIRED_MIRROR_FREE_MB的值,而不是整個failgroup的大小。
道理在哪裡?就像文章開頭提出的,ASM會在不同的failgroup中儲存映象資料,一個normal冗餘的磁碟組要求至少有2個failgroup,一個high冗餘的磁碟組要求至少3個failgroup,如果具有2個failgroup的normal冗餘磁碟組,其中一個failgroup發生了故障,那麼這個磁碟組如何重新滿足冗餘度的要求?不能!因此這種情況下,ASM僅僅給出了一個磁碟的大小作為REQUIRED_MIRROR_FREE_MB的值。
同理,我們可以根據公式計算出USABLE_FILE_MB的值:
ASM> select trunc((free_mb - REQUIRED\_MIRROR\_FREE\_MB) / 2) as useable 2 from v$asm_diskgroup where name='DEMO'; USEABLE ---------- 580
REQUIRED_MIRROR_FREE_MB and USABLE_FILE_MB in high redundancy disk groups
我們已經討論了external和normal冗餘的磁碟組,我們接下來看high冗餘的磁碟組的情況。首先,我們需要建立一high冗餘度的磁碟組,磁碟組中的盤還是我們上面使用的6塊磁碟,每一個盤是一個單獨的failgroup:
ASM> create diskgroup demo high redundancy 2 failgroup FG1 disk 3 'ORCL:san01' 4 failgroup FG2 disk 5 'ORCL:san02' 6 failgroup FG3 disk 7 'ORCL:san03' 8 failgroup FG4 disk 9 'ORCL:san04' 10 failgroup FG5 disk 11 'ORCL:san05' 12 failgroup FG6 disk 13 'ORCL:san06' 14 attribute 'compatible.asm' = '11.2.0.0.0'; Diskgroup created. ASM> select failgroup,sum(total_mb) from v$asm_disk 2 where label like 'SAN%' group by failgroup order by failgroup; FAILGROUP SUM(TOTAL_MB) ------------------------------ ------------- FG1 255 FG2 255 FG3 255 FG4 255 FG5 255 FG6 255
如預期,所有的failgroup的大小都是255MB,REQUIRED_MIRROR_FREE_MB和USABLE_FILE_MB的值的計算方法在normal冗餘和high冗餘下是不是一樣的呢?我們來看一下:
ASM> select name, state, type, total_mb, free_mb, REQUIRED\_MIRROR\_FREE\_MB req_free, USABLE\_FILE\_MB use_mb 2 from v$asm_diskgroup where name = 'DEMO'; NAME STATE TYPE TOTAL_MB FREE_MB REQ_FREE USE_MB ---------- ----------- ------ ---------- ------- -------- ------ DEMO MOUNTED HIGH 1530 1365 510 285
REQUIRED_MIRROR_FREE_MB的值為510MB,等於2個failgroup的大小(如果磁碟組中failgroup的大小不一樣,會取兩個最大的failgroup大小),這是因為一個high冗餘的磁碟組需要能夠容忍丟失2個failgroup而不影響資料的可用性
USABLE_FILE_MB的值為285,按照如下公式計算而來:
ASM> select trunc((free_mb - REQUIRED\_MIRROR\_FREE\_MB) / 3) as useable 2 from v$asm_diskgroup where name='DEMO'; USEABLE ---------- 285
最後我們建立另一個high冗餘的磁碟組,一共3個磁碟組,每2個磁碟一個failgroup:
ASM> create diskgroup demo high redundancy 2 failgroup FG1 disk 3 'ORCL:san01', 4 'ORCL:san02' 5 failgroup FG2 disk 6 'ORCL:san03', 7 'ORCL:san04' 8 failgroup FG3 disk 9 'ORCL:san05', 10 'ORCL:san06' 11 attribute 'compatible.asm' = '11.2.0.0.0'; Diskgroup created. ASM> select failgroup,sum(total_mb) from v$asm_disk 2 where label like 'SAN%' group by failgroup order by failgroup; FAILGROUP SUM(TOTAL_MB) ------------------------------ ------------- FG1 510 FG2 510 FG3 510
上面的輸出應該不需要我過多解釋,一切都符合我們的預期,如果上面所寫的所有內容你都已經充分理解,那麼下面查詢內容的輸出不應該讓你驚訝:
ASM> select name, state, type, total_mb, free_mb, REQUIRED\_MIRROR\_FREE\_MB req_free, USABLE\_FILE\_MB use_mb 2 from v$asm_diskgroup where name = 'DEMO'; NAME STATE TYPE TOTAL_MB FREE_MB REQ_FREE USE_MB ---------- ----------- ------ ---------- ------- -------- ------ DEMO MOUNTED HIGH 1530 1365 510 285
REQUIRED_MIRROR_FREE_MB的值為510MB,它其實是2個磁碟的大小,而不是一個failgroup的大小,理由跟normal冗餘具有2個failgroup的磁碟組一樣,這一次我們的磁碟組是high冗餘三個failgroup,如果一個或兩個failgroup丟失,ASM不能夠重新滿足冗餘度的要求。
下面的是用來計算USABLE_FILE_MB的值的公式:
ASM> select trunc((free_mb - REQUIRED\_MIRROR\_FREE\_MB) / 3) as useable 2 from v$asm_diskgroup where name='DEMO'; USEABLE ---------- 285
In summary
REQUIRED_MIRROR_FREE_MB的值代表了ASM用來重新滿足磁碟組定義的冗餘度所需要的空間,這個值的大小依賴於磁碟組的冗餘度和failgroup的數量。
具有3個failgroup的normal冗餘磁碟組,REQUIRED_MIRROR_FREE_MB的值等於一個failgroup的大小,如果 normal冗餘的磁碟組只有2個failgroup,那麼REQUIRED_MIRROR_FREE_MB的值將等於一個磁碟的大小而非一個failgroup的大小。
具有4個failgroup的high冗餘磁碟組,REQUIRED_MIRROR_FREE_MB的值等於2個failgroup的大小,如high冗餘的磁碟組只有3個failgroup,那麼REQUIRED_MIRROR_FREE_MB的值將會是兩個磁碟的大小。
USABLE_FILE_MB的值代表了總的可用來儲存資料的空間,它的值依賴磁碟組的大小,磁碟組的冗餘度和REQUIRED_MIRROR_FREE_MB的值,USABLE_FILE_MB的值的計算方法如下:
USABLE\_FILE\_MB = (FREE_MB – REQUIRED\_MIRROR\_FREE\_MB) / [2|3]
譯者注: 下圖中代表一個具有3個failgroup的Normal冗餘的磁碟組。其中每個failgroup:F代表free的空間 ,U代表已經使用的空間。
那麼根據上面的假設很容易推斷: (F+U)=一個failgroup的大小 那麼3F+3U=總的磁碟組的大小
那麼當前磁碟組的剩餘可用空間是多少呢?
非常好計算=總的磁碟組的大小-3U
接著,毀壞一個failgroup後剩餘多少可用空間?
這裡我們為了比較容易理解,繼續把這個步驟切成兩步: (總空間-3U)-F ,這個值一個failgroup毀壞後,剩餘的空間,這個剩餘空間還沒考慮這個failgroup上已經使用的空間做RB的所需要的空間。
但是為了滿足 冗餘度的要求,還是要把U這部分空間給RB掉,那麼就是:
(總空間-3U)-F-U,我們做一個轉換也就是 (總空間-3U)-(F +U)=Free-一個failgroup大小,最終再根據冗餘度除以2或著3,這下子是不是很清晰了?
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28218939/viewspace-2135374/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ASM 翻譯系列第三十三彈:REQUIRED_MIRROR_FREE_MB的含義ASMUI
- ASM 翻譯系列第八彈:ASM Internal ASM file extent mapASM
- ASM 翻譯系列第十彈:ASM Internal ASM DISK headerASMHeader
- ASM 翻譯系列第三十二彈:ASM INTERNAL Find block in ASMASMBloC
- ASM 翻譯系列第三十八彈:ASM資料清理ASM
- ASM DG Usable_file_MB和Req_mir_free_MB的含義ASM
- ASM 翻譯系列第三十五彈:ASM 253號檔案——ASM spfileASM
- ASM 翻譯系列第二彈:ASM 12C 版本新特性ASM
- ASM 翻譯系列第九彈:高階知識ASM ToolboxASM
- ASM 翻譯系列第十三彈:ASM 高階知識 - Forcing the issueASM
- ASM 翻譯系列第一彈:基礎知識 ASM AU,Extents,Mirroring 和 FailgroupsASMAI
- ASM 翻譯系列第三十一彈:瞭解ASM檔案的空間分配ASM
- ASM 翻譯系列第三十四彈:ASM磁碟組重要屬性介紹ASM
- ASM 翻譯系列第三十六彈:ACFS磁碟組的重平衡操作ASM
- ASM 翻譯系列第三十九彈:物理後設資料AT表ASM
- ASM 翻譯系列第十一彈:高階知識 Offline or drop?ASM
- Oracle ASM REQUIRED_MIRROR_FREE_MBOracleASMUI
- V$ASM_DISK 檢視含義ASM
- 有關ASM和ASMM的理解ASM
- 【ASM學習】關於 ASM 的隱含引數ASM
- 理解ASM的ExtentASM
- 轉:ASM理解ASM
- ASM之快速理解ASM
- 【ASM】ASMLIB 系列ASM
- 受困於v$asm_dksigroup裡的欄位REQUIRED_MIRROR_FREE_MB!ASMUI
- ASM Failure Group的一點理解ASMAI
- 如何理解ASM裡FAILGROUP的概念ASMAI
- C++中&和*的含義C++
- oracle中的asm文化OracleASM
- oracle ASM中ASM_POWER_LIMIT引數OracleASMMIT
- 全面學習和應用ORACLE ASM特性--(5)管理asm磁碟中的檔案OracleASM
- asm files,asm directories,asm templatesASM
- ASM條帶揭密----_asm_stripesize、_asm_stripewidth引數的設定和影響ASM
- 【翻譯】理解JS的函式呼叫和‘this’的指向JS函式
- 全面學習和應用ORACLE ASM特性--(4)管理asm磁碟組中目錄和檔案OracleASM
- 翻譯 | 理解Java中的記憶體洩漏Java記憶體
- 理解Express express.static 和 __direname 及 __firename的含義Express
- 【ASM】如何建立ASM磁碟ASM