天天看點

ASM 翻譯系列第三十一彈:了解ASM檔案的空間配置設定

本文主要是對asm檔案的空間配置設定進行一些探讨和研究。

asm空間配置設定的最小機關是au,預設的au size是1mb,但在exadata下au 的預設大小是4mb。

asm檔案的空間配置設定是以extent為機關,每一個extent是由一個或多個au組成,在11.2版本,前20000個extent,每一個extent由1個au組成,接下來的20000個extent,每一個由4個au組成,再超出的extent,每一個由16個au組成。這個特性被叫做可變extent。而在11.1版本,extent的增長則遵循的是1-8-64倍au的方式。在版本10,可變extent這個特性還沒出現,是以所有的extent的大小都是1個au。

視圖v$asm_file中,有兩列是關于空間配置設定的:bytes 和 space,它們的定義如下:

bytes - 檔案的大小

space - 檔案實際占用的asm空間的大小

這兩列的定義有一些細微的差異,但是這兩列的數值差異可能是非常大的,下面我們就來實際的看一下,首先交代一下我的測試環境,asm和db的版本為11.2.0.3,使用asmlib方式管理的磁盤:

可以通過如下的查詢來簡單的了解我的環境中磁盤組data的基本情況,例如au的大小,備援的級别,我的資料檔案大多都位于這個磁盤組中。

現在建立一個小于60個extent的“小”檔案和一個大于60個extent的“大”檔案。

“小"檔案的asm檔案号是272,“大”檔案的asm檔案号是271。

接着我們通過前面提到的v$asm_file視圖來擷取這兩個檔案的空間占用資訊:

bytes字段顯示了檔案的實際大小,我們小檔案的大小為10mb,是以占用了10個au(au的size為1mb),小檔案實際占用的asm空間有22個au,其中10個au是實際的資料檔案,1個au為檔案頭,由于檔案是鏡像的,是以檔案真正占用的asm空間為:(10+1)*2=22個au。

對于“大”檔案,bytes字段顯示了檔案的實際大小為100mb也就是100個au,到現在為止一切推論都跟原理相符,但是接着我們發現大檔案的asm空間占用為205個au,按照上面的計算應該有202個au才正确,多出來的3個au是如何來的?接下來我們就來一窺究竟。

下面的查詢(在asm執行個體上運作)展示了asm 271号檔案extent的分布情況:

由于asm檔案是做了鏡像的,我們可以看到每一個虛拟extent有兩個實體extent,而且位于不同的磁盤(其實還位于不同的failgroup),但是最有趣的是查詢結果的最後三行,虛拟extent的号是2147483648,做了3副本。我們可以通過kfed工具看下這個extent的内容,使用kfed我們首先需要知道asm磁盤的名稱。

通過如下查詢獲得asm磁盤的名稱:

我們來檢查下這些au中具體存放的内容:

這些額外的au存放着asm的中繼資料,更具體的講,他們儲存了extent map資訊,而這些extent map資訊不能夠存放在asm的檔案目錄塊中了,因為asm檔案目錄塊中,隻能存放60個extent的條目,一旦超出這個值,那麼就要有額外的地方來記錄這個資訊。由于這屬于asm的中繼資料,是以被做了3副本(雖然是一個normal備援的磁盤組),是以每一個大檔案都會有這麼3個額外的au,但在一個external備援的磁盤組中,僅僅隻會有這麼一個額外的au,不會被做複制。

asm空間的占用取決于2個因素:檔案的實際大小和磁盤組的備援度。

在external備援的磁盤組中,空間的占用:檔案實際大小+1個au(檔案頭)+1個額外的au(如果檔案大于60個au)。

在一個normal備援的磁盤組中,空間的占用:兩倍的檔案實際大小+2個au(檔案頭)+3個額外的au(如果檔案大于60個au)

在一個high備援的磁盤組中,空間的占用:三倍的檔案實際大小+3個au(檔案頭)+3個額外的au(如果檔案大于60個au)

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