深入內核:從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 10.2.0.5 中,執行 kfed repair ,則會說無法打開文件空,而這正說明 repair 命令是存在的,報錯是因為還需要明確指定要修複哪塊磁盤:
那麼這個備份塊具體存在哪裏呢?在 Solaris 下的測試,我們使用truss來進行跟蹤。
在 trace 文件中,找到下麵這段,可以明確地看到 kfed 程序從第 510 個塊中讀出 4096 字節,然後再寫回到第 0 個塊中。
同樣如果是在 Linux 下用裸設備作為 ASM 磁盤,並且用 strace 進行 repair 命令的跟蹤,也可以得到類似結果。
那麼通過 kfed 命令再來驗證一下這兩個塊是否都標誌為頭塊。驗證結果表示塊類型都為 DISKHEAD 。
那麼下一個疑問是,在 11gR2 以後,ASM 磁盤組的 AU Size 可以指定不同的大小,是不是不同的 AU Size 下的磁盤頭塊備份都是在第 510個 塊呢?還是用 truss 來跟蹤一下,這裏的 vdisk3 屬於一個 AU Size=8M 的磁盤組,此時repair命令需要明確指定 aus,否則會報 KFED-00320 錯誤。
在 trace 文件中,可以發現已經不再是去讀第 510 個塊,而是改為讀第 4094 個塊。
用 kfed 驗證第 4094 個塊,確實標誌為 DISKHEAD。
那麼也就是 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 個塊往後算起)。
對於 AU Size=8M 的磁盤組,每個 AU 可以存儲 2048 個塊,塊號為 0-2047 。第 1 個 AU 存儲 2048 個塊,第 2 個 AU 最後 1 個塊號為 2047 ,倒數第 2 個塊號是 2046 ,也就是整體的第 4094 個塊(從第 1 個 AU 的第 1 個塊往後算起)。
對於其它 AU Size 磁盤組的驗證,看到文章的朋友有興趣可以自己做一下。
結論:
從 Oracle 10.2.0.5 開始, ASM 磁盤已經開始自動將頭塊進行備份,備份塊的位置在第 2 個 AU 的倒數第 2 個塊上(對於默認 1M 的 AU 來說,是第 510 個塊),如果頭塊損壞,可以用 kfed repair 命令來修複。因此對於選用 ASM 存儲作為生產環境的用戶來說,盡快升級到 10.2.0.5 是明智的選擇。
在 Oracle 12c 中,Oracle更是推出了 ASMFD 新特性,防止ASM磁盤收到意外的傷害,具體請參考文章:Oracle 12c ASM 防火防盜新特性揭秘 。
本文出自數據和雲公眾號,原文鏈接
最後更新:2017-07-17 18:04:05