asm磁盤頭可能是asm中繼資料中最廣為人知的部分。之前你可能認為當它被破壞或丢失時,隻能寄希望于oracle技術支援人員協助來恢複。在本節中将解釋asm磁盤頭的重要性和它包含的資訊。
asm磁盤是以au為機關進行格式化的,部分au會存放asm中繼資料,其他au存放資料庫中的相關資料(如資料檔案、備份檔案、歸檔檔案等等)。包含asm中繼資料的au會以中繼資料塊的方式進行格式化(一個中繼資料塊的大小為4k)。au0位于asm磁盤的起始位置,它始終用于存儲asm中繼資料。au0的第一個塊,即block 0,就是asm的磁盤頭。
asm 磁盤頭的大部分内容僅與本磁盤相關,但也有部分資訊與整個磁盤組相關,有些甚至于與整個cluster相關。
我們對一個linux平台上通過asmlib管理的磁盤的block 0,使用kfed工具進行輸出觀察。
$ kfed read /dev/oracleasm/disks/asmd1
kfbh.endian: 1 ; 0x000: 0x01
kfbh.hard: 130 ; 0x001: 0x82
kfbh.type: 1 ; 0x002: kfbtyp_diskhead
kfbh.datfmt: 1 ; 0x003: 0x01
kfbh.block.blk: 0 ; 0x004: t=0 numb=0x0
kfbh.block.obj: 2147483648 ; 0x008: type=0x8 numb=0x0
kfbh.check: 473773689 ; 0x00c: 0x1c3d3679
kfbh.fcn.base: 0 ; 0x010: 0x00000000
kfbh.fcn.wrap: 0 ; 0x014: 0x00000000
kfbh.spare1: 0 ; 0x018: 0x00000000
kfbh.spare2: 0 ; 0x01c: 0x00000000
kfdhdb.driver.provstr: orcldiskasmd1 ; 0x000: length=13
kfdhdb.driver.reserved[0]: 1145918273 ; 0x008: 0x444d5341
kfdhdb.driver.reserved[1]: 49 ; 0x00c: 0x00000031
kfdhdb.driver.reserved[2]: 0 ; 0x010: 0x00000000
kfdhdb.driver.reserved[3]: 0 ; 0x014: 0x00000000
kfdhdb.driver.reserved[4]: 0 ; 0x018: 0x00000000
kfdhdb.driver.reserved[5]: 0 ; 0x01c: 0x00000000
kfdhdb.compat: 186646528 ; 0x020: 0x0b200000
kfdhdb.dsknum: 0 ; 0x024: 0x0000
kfdhdb.grptyp: 1 ; 0x026: kfdgtp_external
kfdhdb.hdrsts: 3 ; 0x027: kfdhdr_member
kfdhdb.dskname: asmd1 ; 0x028: length=5
kfdhdb.grpname: data ; 0x048: length=4
kfdhdb.fgname: asmd1 ; 0x068: length=5
...
上述kfed指令的輸出結果顯示這個asm塊有兩種類型的資料 以kfbh為字首的塊頭資訊和以kfdhdb為字首的asm磁盤頭資訊。實際上,每個asm中繼資料塊都會有塊頭資訊和與塊類型相比對的一些相關資料。
資料類型
值
kfbh.endian
系統字序。0 - 大字序,1 - 小字序。
kfbh.type
asm塊類型。kfbtyp_diskhead 表示這是一個asm磁盤頭類型塊。
kfbh.block.blk
asm塊号。注意asm磁盤頭塊的塊編号是0
重要的asm磁盤頭資料
kfdhdb.driver.provstr
asmlib磁盤是orcldisk+磁盤名,非asmlib磁盤是orcldisk
kfdhdb.dsknum
asm磁盤編号
kfdhdb.grptyp
磁盤級備援級别 kfdgtp_external 代表 external級别, kfdgtp_normal 代表 normal級别, kfdgtp_high 代表 high級别.
kfdhdb.hdrsts
asm磁盤頭狀态. v$asm_disk.header_status視圖内包含所有可能的狀态.
kfdhdb.dskname
asm磁盤名
kfdhdb.grpname
asm磁盤組名
kfdhdb.fgname
asm失敗組名
kfdhdb.crestmp.hi|lo
磁盤添加到磁盤組的時間.
kfdhdb.mntstmp.hi|lo
磁盤最近一次被挂接的時間.
kfdhdb.secsize
磁盤的扇區大小(bytes).
kfdhdb.blksize
asm中繼資料塊的大小(bytes).
kfdhdb.ausize
alloocation unit的大小(bytes).預設的au大小為1 mb.
kfdhdb.dsksize
磁盤大小(以au為機關).本例中的磁盤大小為10239 mb.
kfdhdb.fstlocn
指針指向asm的空閑空間表.1代表本au中的asm 塊1.
kfdhdb.altlocn
指針指向asm的配置設定表.2 代表本au中的asm 塊2.
kfdhdb.f1b1locn
指針指向asm的檔案目錄.2代表本asm磁盤的 au 2.
kfdhdb.dbcompat
最小的資料庫相容版本. 0x0a100000 = 10.1.
kfdhdb.grpstmp.hi
lo
kfdhdb.vfstart
vfend
kfdhdb.spfile
asm spfile參數檔案的au号.本特性限于11.2或更高版本.
kfdhdb.spfflg
asm spfile參數檔案辨別.如果這個值是1,asm spfile參數檔案則位于本磁盤的kfdhdb.spfile參數的au .本特性限于11.2或更高版本.
asm從11.1.0.7版本開始,磁盤頭塊的資訊會自動備份到au1的倒數第二個asm中繼資料塊中。知道au的塊大小和asm中繼資料塊的大小後,就能找到倒數第二個塊的塊編号。通過kfed工具可以從塊頭中讀取到這些資訊,并計算出au1的倒數第二個塊的塊編号。
$ ausize=`kfed read /dev/oracleasm/disks/asmd1 | grep ausize | tr -s ' ' | cut -d' ' -f2`
$ blksize=`kfed read /dev/oracleasm/disks/asmd1 | grep blksize | tr -s ' ' | cut -d' ' -f2`
$ let n=$ausize/$blksize-2
$ echo $n
254
譯者注:其實在10.2.0.5版本,asm也會自動備份磁盤頭的資料到au 1的倒數第二個asm中繼資料塊中。
$ kfed read /dev/oracleasm/disks/asmd1 aun=1 blkn=254
能夠看到與au0的中繼資料塊0相同的内容。當磁盤頭被破壞或者丢失時,這個備份将是非常有用的。隻需要運作kfed repair [磁盤名]指令即可修複,如果au大小不是預設的1mb,還需要指定au大小的具體值。 如果懷疑asm的磁盤頭出現故障,最好尋求oracle技術支援人員的幫助,而不是獨自進行操作。
exadata中的asm磁盤并不是以裝置名的方式給作業系統使用。它們使用專用的名稱格式 o/[存儲節點ip]/[磁盤名].kfed工具支援這種名稱格式,是以kfed可以在exadata環境中使用。檢視exadata磁盤的asm磁盤頭:
$ kfed read o/192.168.10.9/dbfs_dg_cd_03_exadatacel01
kfdhdb.dskname:dbfs_dg_cd_03_exadatacel01 ; 0x028: length=26
kfdhdb.grpname: dbfs_dg ; 0x048: length=7
kfdhdb.fgname: exadatacel01 ; 0x068: length=12
kfdhdb.ausize: 4194304 ; 0x0bc: 0x00400000
asm磁盤頭中部分exadata專用屬性如下:
asm磁盤名由磁盤組名 (dbfs_dg),存儲節點磁盤辨別(cd),存儲節點磁盤編(3)号和存儲節點名(exadatacel01)構成.
失敗組的名字與存儲節點的名字相同.exadata環境中預設的au大小是4mb。
asm磁盤頭包含asm磁盤組正常運作和保持可用的重要中繼資料。 為防止asm磁盤頭的突然損壞和丢失,oracle推薦通過磁盤分區的方式,就是将它“移動”到遠離磁盤實體起始位置的方式實作對asm磁盤頭的保護。
exadata的asm磁盤頭資訊通過不暴露給資料庫節點的方式進行保護。
asm從11.1.0.7版本開始,asm磁盤頭通過維護一份在au1備份的方式實作進一步的保護機制。
<b>本文來自雲栖社群合作夥伴“dbgeek”</b>