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

更新时间:2016-08-11 11:49:46 点击次数:2038次

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备份的方式实现进一步的保护机制。

本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

回到顶部
嘿,我来帮您!