天天看點

Oracle ASM 翻譯系列第十彈:ASM Internal ASM DISK headerASM disk header

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>