天天看點

深入核心:從Oracle ASM自動備份頭塊到ASMFD

深入核心:從Oracle ASM自動備份頭塊到ASMFD

張樂奕

雲和恩墨副總經理 oracle ace 總監

itpub oracle資料庫管理版版主、oracle高可用版版主、acoug聯合創始人

在 oracle 10.2.0.5 之前,asm 磁盤的頭塊并沒有自己的備份,是以一旦頭塊損壞,如果沒有以前 kfed read 備份出來的資訊,也就沒有辦法使用 kfed merge來作頭塊恢複,特别是如果一個磁盤組中所有的磁盤頭塊都出現問題(比如被人為地建立了 pv ),恢複 asm 磁盤頭塊的操作就會非常麻煩。

但是從 oracle 10.2.0.5 之後,asm 磁盤的頭塊會自動備份在另外一個塊中,這實際上是 oracle 11g 出現的功能,不過經過測試,在 oracle 10.2.0.5 版本中,這個備份也是存在的。

正是因為存在這個備份,是以 oracle 10.2.0.5 之後的 kfed 程式才有了新的 repair 指令,該指令将備份塊直接覆寫到磁盤頭塊,完成修複工作。

在 oracle 10.2.0.4 中,如果嘗試執行 kfed repair ,則會報錯說指令行參數不正确,此報錯說明并不存在 repair 指令:

深入核心:從Oracle ASM自動備份頭塊到ASMFD

但是在 oracle 10.2.0.5 中,執行 kfed repair ,則會說無法打開檔案空,而這正說明 repair 指令是存在的,報錯是因為還需要明确指定要修複哪塊磁盤:

深入核心:從Oracle ASM自動備份頭塊到ASMFD

那麼這個備份塊具體存在哪裡呢?在 solaris 下的測試,我們使用truss來進行跟蹤。

深入核心:從Oracle ASM自動備份頭塊到ASMFD

在 trace 檔案中,找到下面這段,可以明确地看到 kfed 程式從第 510 個塊中讀出 4096 位元組,然後再寫回到第 0 個塊中。

深入核心:從Oracle ASM自動備份頭塊到ASMFD

同樣如果是在 linux 下用裸裝置作為 asm 磁盤,并且用 strace 進行 repair 指令的跟蹤,也可以得到類似結果。

深入核心:從Oracle ASM自動備份頭塊到ASMFD

那麼通過 kfed 指令再來驗證一下這兩個塊是否都标志為頭塊。驗證結果表示塊類型都為 diskhead 。

深入核心:從Oracle ASM自動備份頭塊到ASMFD

那麼下一個疑問是,在 11gr2 以後,asm 磁盤組的 au size 可以指定不同的大小,是不是不同的 au size 下的磁盤頭塊備份都是在第 510個 塊呢?還是用  truss 來跟蹤一下,這裡的 vdisk3 屬于一個 au size=8m 的磁盤組,此時repair指令需要明确指定 aus,否則會報 kfed-00320 錯誤。

深入核心:從Oracle ASM自動備份頭塊到ASMFD

在 trace 檔案中,可以發現已經不再是去讀第 510 個塊,而是改為讀第 4094 個塊。

深入核心:從Oracle ASM自動備份頭塊到ASMFD

用 kfed 驗證第 4094 個塊,确實标志為 diskhead。

深入核心:從Oracle ASM自動備份頭塊到ASMFD

那麼也就是 au 1m 的磁盤組頭塊備份在第 510 個塊上,而 au 8m 的磁盤組頭塊備份在第 4094 個塊上,備份塊的存儲位置有規律嗎?有的,始終儲存在第   2個au 的倒數第 2 個塊上。下面來驗證這個觀點。

對于預設的磁盤組, au size=1m ,每個 au 中可以存儲 256 個塊,塊号為  0-255 。第 1 個 au 存儲 256 個塊,第 2 個 au 最後 1 個塊号為 255,倒數第 2 個塊号是 254,也就是整體的第 510 個塊(從第 1 個 au 的第 1 個塊往後算起)。

深入核心:從Oracle ASM自動備份頭塊到ASMFD

對于 au size=8m 的磁盤組,每個 au 可以存儲 2048 個塊,塊号為 0-2047 。第 1 個 au 存儲 2048 個塊,第 2 個 au 最後 1 個塊号為 2047 ,倒數第 2 個塊号是 2046 ,也就是整體的第 4094 個塊(從第 1 個 au 的第 1 個塊往後算起)。

深入核心:從Oracle ASM自動備份頭塊到ASMFD

對于其它 au size 磁盤組的驗證,看到文章的朋友有興趣可以自己做一下。

結論:

從 oracle 10.2.0.5 開始, asm 磁盤已經開始自動将頭塊進行備份,備份塊的位置在第 2 個 au 的倒數第 2 個塊上(對于預設 1m 的 au 來說,是第 510 個塊),如果頭塊損壞,可以用 kfed repair 指令來修複。是以對于選用 asm 存儲作為生産環境的使用者來說,盡快更新到 10.2.0.5 是明智的選擇。

繼續閱讀