Oracle kfed – ASM 元数据编辑器

如果自己搞不定可以找诗檀软件专业ORACLE数据库修复团队成员帮您恢复!

诗檀软件专业数据库修复团队

服务热线 : 13764045638    QQ号:47079569    邮箱:service@parnassusdata.com

 

kfed 是一款未公开的ASM实用程序,可以用于读取并修改ASM元数据块。它是个独立的实用程序,独立于ASM实例,因此可以在安装或卸载的磁盘组中使用。Kfed最强大的特点是能够修复损坏的ASM元数据。
kfed二分制出现在最近的ASM版本中。但如果你在$ ORACLE_HOME/ bin目录下没有看到它(例如,它可能不会出现在10.1版本),它可能被建在其他目录中,如下所示:

$ cd $ORACLE_HOME/rdbms/lib
$ make -f ins* ikfed
kfed read

有KFED读命令,我们可以读取单一的ASM元数据块。句法是

$ kfed read [aun=ii aus=jj blkn=kk dev=]asm_disk_name
其中该命令行参数为

  • aun -读取分配单位(AU)号码。默认值是AU0,或ASM磁盘的开始
  • aus – AU大小. 默认为 1048576 (1MB). 从非默认AU大小的磁盘组读取时,指定AUS。
  • blkn – 读块号。默认值是块0,或者AU的第一个块。
  • dev – ASM磁盘或设备名称。注意,关键字dev可以省略,但ASM磁盘名称是必须的。

使用kfed读取ASM磁盘头块

下面是使用kfed程序从ASM磁盘/ dev / sda1中读取ASM磁盘头的一个例子。

$ kfed read /dev/sda1 | 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:                  3102721733 ; 0x00c: 0xb8efc6c5
kfbh.fcn.base:                        0 ; 0x010: 0x00000000
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000

kfdhdb.dsknum:                        0 ; 0x024: 0x0000
kfdhdb.grptyp:                        2 ; 0x026: KFDGTP_NORMAL
kfdhdb.hdrsts:                        3 ; 0x027: KFDHDR_MEMBER
kfdhdb.dskname:               DATA_0000 ; 0x028: length=9
kfdhdb.grpname:                    DATA ; 0x048: length=4
kfdhdb.fgname:                DATA_0000 ; 0x068: length=9
kfdhdb.ausize:                  1048576 ; 0x0bc: 0x00100000
kfdhdb.dsksize:                   12284 ; 0x0c4: 0x00002ffc


注意,上述kfed命令等同于这一个(所有参数明确设置为默认值):

$ kfed read aun=0 aus=1048576 blkn=0 dev=/dev/sda1
我们看到,上面的kfed输出被很好地格式化,且是可读的(某种程度上)。字段基于ASM元数据块的实际内容进行分组。

在这个例子中,kfbh字段显示块头数据,最重要的是kfbh.type,它显示KFBTYP_DISKHEAD,意思是ASM磁盘头部。这是ASM磁盘头预期的块类型。

然后,我们看到了ASM磁盘头元数据块的实际内容 –  kfdhdb字段。其中有些是磁盘数(kfdhdb.dsknum),该情况下的0,该组冗余类型(kfdhdb.grptyp),该情况下的正常冗余,磁盘头状态(kfdhdb.hdrsts),该情况下的部件,磁盘名称(kfdhdb.dskname)-  DATA_0000等。

关于kfdhdb 字段的完整解释,请参考ASM disk header

使用kfed读取任何ASM元数据块

接下来这个例子演示如何读取ASM文件目录块。对此我们可以使用下面的kfed命令:

$ kfed read aun=10 blkn=1 dev=/dev/sda1 | more
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                            4 ; 0x002: KFBTYP_FILEDIR

 

请注意,我必须指定AU10和块1,以读取文件目录块。看一下发布的ASM File Directory,学习如何定位一个文件目录块。
我的ASM元数据块损坏

如果你看到kfbh.type= KFBTYP_INVALID,位于磁盘上的磁盘头,你相信该盘属于ASM磁盘组,这表明ASM磁盘头损坏。但是,不要妄下结论!你正在寻找合适的盘?这是正确的磁盘分区吗?你能否通过一些其他的名字来访问磁盘- 在多路设置中?如果你不能确定,或者如果磁盘头实际上已损坏,联系Oracle Support寻求帮助。

注意,这适用于任何ASM元数据块。如果ASM希望找到一个元数据块,却只找到了归零或包含垃圾的块,它将报告该块为KFBTYP_INVALID,并且会在ASM和/或数据库警报日志中(取决于哪个实例发现了该问题)报错(通常是ORA-1519

kfed write

有KFED写命令,我们可以写一个单独的ASM元数据块。句法是

$ kfed write [aun=ii aus=jj blkn=kk dev=]asm_disk_name text=new_contents chksum=yes
其中新的命令行参数为:

  • text -有新的块内容的文本文件
  • checksum=yes -计算并写入正确的校验和。请注意,文本文件中有新内容的校验和不一定是正确的。

使用kfedASM元数据块中写入正确的校验和

一个ASM元数据可能看起来很好,但实际上已损坏。例如块校验和(kfbh.check)可能是错误的,这种情况下,就需要进行校正。事实上,如果唯一的问题是校验和不正确,只需简单地读出块并将其写回,予以校纠正。kfed会计算新的校验和,并将正确的校验和写回该块。

下面是完整的步骤,以纠正磁盘/ dev / sda1上AU0中块2的坏校验和:

$ kfed read aun=0 blkn=2 dev=/dev/sda1 > /tmp/aun0_blkn2_sda1.kfed
$ kfed write aun=0 blkn=2 dev=/dev/sda1 text=/tmp/aun0_blkn2_sda1.kfed chksum=yes
注意:如果有任何可疑的ASM元数据块损坏,可以寻求Oracle Support帮助。

kfed find

kfed查找会检查分配单元中的所有块,并报告找到的块类型。句法是:

$ kfed find [aun=ii aus=jj dev=]asm_disk_name
我们看到,查找命令参数与读命令参数相同,但不同的是,查找是在一个分配单元的所有块上进行操作。

使用kfed查找命令,以验证AU0中的块Use kfed find command to verify blocks in AU0

这个例子是关于使用KFED查找,以验证AU0所有块具有预期的ASM元数据。

$ kfed find /dev/sda1
预期的结果是块0为类型1,块1为类型2,其他块为类型3,即:

$ kfed find /dev/sda1
Block 0 has type 1
Block 1 has type 2
Block 2 has type 3
Block 3 has type 3
Block 4 has type 3

Block 255 has type 3

 
如果你在输出中看到任何其他的,就表明存在损坏的ASM元数据块。这种情况下,请寻求Oracle Supportt服务。

请注意,我的分配单位大小为1MB,所以AU只有255个块。如果你的分配单位大小为4MB,同样的命令应该会返回到1024个块的块类型信息。

还要指出,上述查找命令,我们只能看到预期的ASM元数据块类型。我们没有看实际的元数据块内容。有些ASM元数据块损坏确实有块内容,即该块类型是正确的,但内容是错误的。只有当ASM读取损坏块时才能检测到该类损坏,这种情况下会报错ORA-15196。如果你不幸遇到该错误,请寻求Oracle Support服务。

结论

kfed是个低调但非常强大的工具。我只展示了少数几个指令,KFED还可以格式化空ASM文件,对ASM元数据块进行完整性检查,显示数据结构的大小以及执行其他一些更隐蔽的操作。

Comment

*

沪ICP备14014813号-2

沪公网安备 31010802001379号