張樂奕
云和恩墨副總經(jīng)理 Oracle ACE 總監(jiān)
ITPUB Oracle數(shù)據(jù)庫管理版版主、Oracle高可用版版主、ACOUG聯(lián)合創(chuàng)始人
在 Oracle 10.2.0.5 之前,ASM 磁盤的頭塊并沒有自己的備份,因此一旦頭塊損壞,如果沒有以前 kfed read 備份出來的信息,也就沒有辦法使用 kfed merge來作頭塊恢復,特別是如果一個磁盤組中所有的磁盤頭塊都出現(xiàn)問題(比如被人為地創(chuàng)建了 PV ),恢復 ASM 磁盤頭塊的操作就會非常麻煩。
但是從 Oracle 10.2.0.5 之后,ASM 磁盤的頭塊會自動備份在另外一個塊中,這實際上是 Oracle 11g 出現(xiàn)的功能,不過經(jīng)過測試,在 Oracle 10.2.0.5 版本中,這個備份也是存在的。
正是因為存在這個備份,所以 Oracle 10.2.0.5 之后的 kfed 程序才有了新的 repair 命令,該命令將備份塊直接覆蓋到磁盤頭塊,完成修復工作。
在 Oracle 10.2.0.4 中,如果嘗試執(zhí)行 kfed repair ,則會報錯說命令行參數(shù)不正確,此報錯說明并不存在 repair 命令:
但是在 Oracle 10.2.0.5 中,執(zhí)行 kfed repair ,則會說無法打開文件空,而這正說明 repair 命令是存在的,報錯是因為還需要明確指定要修復哪塊磁盤:
那么這個備份塊具體存在哪里呢?在 Solaris 下的測試,我們使用truss來進行跟蹤。
在 trace 文件中,找到下面這段,可以明確地看到 kfed 程序從第 510 個塊中讀出 4096 字節(jié),然后再寫回到第 0 個塊中。
同樣如果是在 Linux 下用裸設(shè)備作為 ASM 磁盤,并且用 strace 進行 repair 命令的跟蹤,也可以得到類似結(jié)果。
那么通過 kfed 命令再來驗證一下這兩個塊是否都標志為頭塊。驗證結(jié)果表示塊類型都為 DISKHEAD 。
那么下一個疑問是,在 11gR2 以后,ASM 磁盤組的 AU Size 可以指定不同的大小,是不是不同的 AU Size 下的磁盤頭塊備份都是在第 510個 塊呢?還是用 truss 來跟蹤一下,這里的 vdisk3 屬于一個 AU Size=8M 的磁盤組,此時repair命令需要明確指定 aus,否則會報 KFED-00320 錯誤。
在 trace 文件中,可以發(fā)現(xiàn)已經(jīng)不再是去讀第 510 個塊,而是改為讀第 4094 個塊。
用 kfed 驗證第 4094 個塊,確實標志為 DISKHEAD。
那么也就是 AU 1M 的磁盤組頭塊備份在第 510 個塊上,而 AU 8M 的磁盤組頭塊備份在第 4094 個塊上,備份塊的存儲位置有規(guī)律嗎?有的,始終保存在第 2個AU 的倒數(shù)第 2 個塊上。下面來驗證這個觀點。
對于默認的磁盤組, AU Size=1M ,每個 AU 中可以存儲 256 個塊,塊號為 0-255 。第 1 個 AU 存儲 256 個塊,第 2 個 AU 最后 1 個塊號為 255,倒數(shù)第 2 個塊號是 254,也就是整體的第 510 個塊(從第 1 個 AU 的第 1 個塊往后算起)。
對于 AU Size=8M 的磁盤組,每個 AU 可以存儲 2048 個塊,塊號為 0-2047 。第 1 個 AU 存儲 2048 個塊,第 2 個 AU 最后 1 個塊號為 2047 ,倒數(shù)第 2 個塊號是 2046 ,也就是整體的第 4094 個塊(從第 1 個 AU 的第 1 個塊往后算起)。
對于其它 AU Size 磁盤組的驗證,看到文章的朋友有興趣可以自己做一下。
結(jié)論:
從 Oracle 10.2.0.5 開始, ASM 磁盤已經(jīng)開始自動將頭塊進行備份,備份塊的位置在第 2 個 AU 的倒數(shù)第 2 個塊上(對于默認 1M 的 AU 來說,是第 510 個塊),如果頭塊損壞,可以用 kfed repair 命令來修復。因此對于選用 ASM 存儲作為生產(chǎn)環(huán)境的用戶來說,盡快升級到 10.2.0.5 是明智的選擇。
在 Oracle 12c 中,Oracle更是推出了 ASMFD 新特性,防止ASM磁盤收到意外的傷害,具體請參考文章:Oracle 12c ASM 防火防盜新特性揭秘