- 介绍:
由于磁盘头的信息相对简单而且变化很小,特别是同一磁盘组的磁盘,每个磁盘头的信息几乎一致,而当我们了解了磁盘头的信息后,一旦某个磁盘头的信息出现了问题,我们可以利用其他磁盘头信息然后通过kfed工具对其进行修改和调整,达到修复的目的。其中用得最多的是读取(Read)、修复(Repair)和合并(Merge)三个操作。
首先大家要明确一点,Oracle正因为知道ASM磁盘头的重要性,因此默认情况下,就对其进行了镜像备份,有点类似于控制文件。在每个ASM文件的第一个AU位置,是磁盘头信息,而第1个AU位置最后第2个数据块中,默认情况下就是对磁盘头信息的镜像备份,如AU的缺省大小是1M时,那个数据块就是254,我们可以直接查询
- 实验测试:
磁盘头信息:
[oracle@rac01~]$ kfed read /dev/asm-disk1 aun=0 blkn=0|more
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: blk=0
kfbh.block.obj: 2147483648 ; 0x008: disk=0
kfbh.check: 3871657466 ; 0x00c: 0xe6c4cdfa
kfbh.fcn.base: 4195 ; 0x010: 0x00001063
kfbh.fcn.wrap: 0 ; 0x014: 0x00000000
kfbh.spare1: 0 ; 0x018: 0x00000000
kfbh.spare2: 0 ; 0x01c: 0x00000000
kfdhdb.driver.provstr: ORCLDISK ; 0x000: length=8
kfdhdb.driver.reserved[0]: 0 ; 0x008: 0x00000000
1号AU倒数第二个数据块信息:
[oracle@rac01~]$ kfed read /dev/asm-disk1 aun=1 blkn=254|more
kfbh.endian: 1 ; 0x000: 0x01
kfbh.hard: 130 ; 0x001: 0x82
kfbh.type: 1 ; 0x002: KFBTYP_DISKHEAD
kfbh.datfmt: 1 ; 0x003: 0x01
kfbh.block.blk: 254 ; 0x004: blk=254
kfbh.block.obj: 2147483648 ; 0x008: disk=0
kfbh.check: 3871657220 ; 0x00c: 0xe6c4cd04
kfbh.fcn.base: 4195 ; 0x010: 0x00001063
kfbh.fcn.wrap: 0 ; 0x014: 0x00000000
kfbh.spare1: 0 ; 0x018: 0x00000000
kfbh.spare2: 0 ; 0x01c: 0x00000000
kfdhdb.driver.provstr: ORCLDISK ; 0x000: length=8
kfdhdb.driver.reserved[0]: 0 ; 0x008: 0x00000000
可以看到查询出来的内容同样也是磁盘头内容,这部分是ORACLE自行备份的信息,但是注意该特性只在10.2.0.5及以上版本才有,10.2.0.4版本数据库没有这部分信息。
利用dd命令清空 /dev/asm-disk1****磁盘头:
[grid@rac1 ~]$ dd if=/dev/zero of=/dev/asm-disk1 bs=4096 count=1
1+0 records in
1+0 records out
4096 bytes (4.1 kB) copied, 0.000104572 s, 39.2 MB/s
再次查看:
**[grid@rac1 ~]$ kfed read /dev/asm-disk1 aun=0 blkn=0 | more**
kfbh.endian: 0 ; 0x000: 0x00
kfbh.hard: 0 ; 0x001: 0x00
kfbh.type: 0 ; 0x002: KFBTYP_INVALID
kfbh.datfmt: 0 ; 0x003: 0x00
kfbh.block.blk: 0 ; 0x004: blk=0
kfbh.block.obj: 0 ; 0x008: file=0
kfbh.check: 0 ; 0x00c: 0x00000000
kfbh.fcn.base: 0 ; 0x010: 0x00000000
kfbh.fcn.wrap: 0 ; 0x014: 0x00000000
kfbh.spare1: 0 ; 0x018: 0x00000000
kfbh.spare2: 0 ; 0x01c: 0x00000000
7F3EC93EE400 00000000 00000000 00000000 00000000 [................]
Repeat 255 times
KFED-00322: Invalid content encountered during block traversal: [kfbtTraverseBlock][Invalid OSM block type][][0]
kfbh.type: 0 ; 0x002: KFBTYP_INVALID //磁盘头状态损坏
使用repair自动利用备份进行修复:
[grid@rac1 ~]$ kfed repair /dev/asm-disk1
再次查看:
[grid@rac1 ~]$ kfed read /dev/asm-disk1 aun=0 blkn=0 | more
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: blk=0
kfbh.block.obj: 2147483648 ; 0x008: disk=0
kfbh.check: 3871657466 ; 0x00c: 0xe6c4cdfa
kfbh.fcn.base: 4195 ; 0x010: 0x00001063
kfbh.fcn.wrap: 0 ; 0x014: 0x00000000
kfbh.spare1: 0 ; 0x018: 0x00000000
kfbh.spare2: 0 ; 0x01c: 0x00000000
kfdhdb.driver.provstr: ORCLDISK ; 0x000: length=8
kfdhdb.driver.reserved[0]: 0 ; 0x008: 0x00000000
kfbh.type: 1 ; 0x002: KFBTYP_DISKHEAD
修复完成。
很简单