ASM 翻译系列第十弹:ASM Internal ASM DISK header

原文: ASM disk header
作者: Bane Radulovic
译者:庄培培,沃趣科技数据库售前工程师,主要负责数据库平台架构方案设计、产品验证测试。
审校:魏兴华
责编:钱曙光

ASM disk header

ASM磁盘头可能是ASM元数据中最广为人知的部分。之前你可能认为当它被破坏或丢失时,只能寄希望于Oracle技术支持人员协助来恢复。在本节中将解释ASM磁盘头的重要性和它包含的信息。

Block zero

ASM磁盘是以AU为单位进行格式化的,部分AU会存放ASM元数据,其他AU存放数据库中的相关数据(如数据文件、备份文件、归档文件等等)。包含ASM元数据的AU会以元数据块的方式进行格式化(一个元数据块的大小为4K)。AU0位于ASM磁盘的起始位置,它始终用于存储ASM元数据。AU0的第一个块,即block 0,就是ASM的磁盘头。

ASM disk header contents

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元数据块都会有块头信息和与块类型相匹配的一些相关数据。

Important ASM metadata block 0 header data

数据类型
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 disk header backup

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
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.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
...

能够看到与AU0的元数据块0相同的内容。当磁盘头被破坏或者丢失时,这个备份将是非常有用的。只需要运行kfed repair [磁盘名]命令即可修复,如果AU大小不是默认的1MB,还需要指定AU大小的具体值。 如果怀疑ASM的磁盘头出现故障,最好寻求Oracle技术支持人员的帮助,而不是独自进行操作。

ASM disk header in Exadata

Exadata中的ASM磁盘并不是以设备名的方式给操作系统使用。它们使用专用的名称格式 o/[存储节点IP]/[磁盘名].kfed工具支持这种名称格式,所以kfed可以在exadata环境中使用。查看Exadata磁盘的ASM磁盘头:

$ kfed read o/192.168.10.9/DBFS_DG_CD_03_exadatacel01
kfbh.endian: 1 ; 0x000: 0x01
kfbh.hard: 130 ; 0x001: 0x82
kfbh.type: 1 ; 0x002: KFBTYP_DISKHEAD
...
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备份的方式实现进一步的保护机制。

ASM翻译系列导读:

  • ASM 翻译系列第十弹:ASM Internal ASM DISK header
  • ASM 翻译系列第九弹:ASM工具箱
  • ASM 翻译系列第八弹:ASM Internal ASM file extent map
  • ASM 翻译系列第七弹:高级知识 How many partners?
  • ASM 翻译系列第六弹:高级知识如何映射asmlib管理的盘到它对应的设备名
  • ASM 翻译系列第五弹:高级知识ASM元数据概述
  • ASM 翻译系列第四弹:高级知识kfed元数据编辑器
  • ASM 翻译系列第三弹:ASM disk的基础知识
  • ASM 翻译系列第二弹:ASM 12C 版本新特性
  • ASM 翻译系列第一弹:基础知识 ASM AU,Extents,Mirroring 和 Failgroups

你可能感兴趣的:(ASM 翻译系列第十弹:ASM Internal ASM DISK header)