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