如果自己搞不定可以找诗檀软件专业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元数据块进行完整性检查,显示数据结构的大小以及执行其他一些更隐蔽的操作。