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

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

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

:我听说过未公开的KFED(内核文件编辑器)实用程序。你能解释一下KFED如何运行吗?

:kfed是一款未公开的ASM实用程序,用于读取和修改ASM实例。所以它可以与挂载或是卸载的磁盘一起使用。   kfedOracle Database 11g版本1中可用,用于读写ASM元数据,尤其是磁盘头和ASM元数据内容。写模式的kfed,力量很大,也有可能成为不法分子手中潜在的破坏性工具。使用-help选项调用的KFED会显示该实用程序的联机帮助。   kfed最常见的特征是能够修复损坏的ASM元数据。KFED二进制文件位于$ ORACLE_HOME/ bin目录下。有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 磁盘头块.

# displays online help for the utility $ kfed -help # reads the disk header to stdout $ kfed op=read dev=/dev/mapper/itstor741_11p1 # reads the specified AU and block into file /tmp/a $ kfed op=read dev=/dev/mapper/itstor741_11p1 aunum=3 blknum=3 text=/tmp/a # writes from /tmp/a into the specified AU and block #block checksum is computed and written together with data $ kfed op=write dev=/dev/mapper/itstor741_11p1 aunum=3 blknum=3 text=/tmp/a

下面是使用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,请参考MOS文档:1505005.1,其中有涉及针对KFED调用 LDD命令并保存了所需的KFED库。 这里有个简单的shell脚本叫做 kfed.ksh,显示ASM磁盘头信息。 kfed read /dev/oracleasm/disks/DATA1 |egrep -i "kfdhdb.hdrsts|kfdhdb.dskname|kfdhdb.grpname|kfdhdb.fgname|kfdhdb.secsize|blksize|driver.provstr|kfdhdb.ausize" cat <Legend: kfdhdb.hdrsts - Status of disk kfdhdb.dskname - Name of the disk kfdhdb.grpname - Name of disk group the disk belongs to kfdhdb.fgname - Name of failure group the disk belongs to kfdhdb.secsize - Sector size of disk kfdhdb.blksize - Blocksize of disk kfdhdb.driver.provstr - Provision string for use with asm kfdhdb.ausize - AU size !! +ASM > ./kfed.ksh kfdhdb.driver.provstr: ORCLDISKDATA1 ; 0x000: length=13 kfdhdb.hdrsts: 3 ; 0x027: KFDHDR_MEMBER kfdhdb.dskname: DATA1 ; 0x028: length=5 kfdhdb.grpname: DATA ; 0x048: length=4 kfdhdb.fgname: DATA1 ; 0x068: length=5 kfdhdb.secsize: 512 ; 0x0b8: 0x0200 kfdhdb.blksize: 4096 ; 0x0ba: 0x1000 kfdhdb.ausize: 1048576 ; 0x0bc: 0x00100000 Legend: kfdhdb.hdrsts - Status of disk kfdhdb.dskname - Name of the disk kfdhdb.grpname - Name of disk group the disk belongs to kfdhdb.fgname - Name of failure group the disk belongs to kfdhdb.secsize - Sector size of disk kfdhdb.blksize - Blocksize of disk kfdhdb.driver.provstr - Provision string for use with asm kfdhdb.ausize - AU size +ASM > kfed read /dev/oracleasm/disks/DATA1 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: 2184817018 ; 0x00c: 0x8239a97a kfbh.fcn.base: 15632 ; 0x010: 0x00003d10 kfbh.fcn.wrap: 0 ; 0x014: 0x00000000 kfbh.spare1: 0 ; 0x018: 0x00000000 kfbh.spare2: 0 ; 0x01c: 0x00000000 kfdhdb.driver.provstr: ORCLDISKDATA1 ; 0x000: length=13 ... ... ... +ASM > kfed read /dev/oracleasm/disks/DATA1 aunum=2 blknum=0 text=/tmp/DATA1.txt kfbh.endian: 1 ; 0x000: 0x01 kfbh.hard: 130 ; 0x001: 0x82 kfbh.type: 5 ; 0x002: KFBTYP_LISTHEAD kfbh.datfmt: 1 ; 0x003: 0x01 kfbh.block.blk: 0 ; 0x004: T=0 NUMB=0x0 kfbh.block.obj: 1 ; 0x008: TYPE=0x0 NUMB=0x1 kfbh.check: 4277819812 ; 0x00c: 0xfefa59a4 kfbh.fcn.base: 9635 ; 0x010: 0x000025a3 kfbh.fcn.wrap: 0 ; 0x014: 0x00000000 kfbh.spare1: 0 ; 0x018: 0x00000000 kfbh.spare2: 0 ; 0x01c: 0x00000000 kfflhe[0].cnt: 0 ; 0x000: 0x00000000 kfflhe[0].rcvr: 0 ; 0x004: 0x00000000 kfflhe[0].high: 0 ; 0x008: 0x00000000 kfflhe[0].frlist.number: 4294967295 ; 0x00c: 0xffffffff kfflhe[0].frlist.incarn: 0 ; 0x010: A=0 NUMM=0x0 kfflhe[0].dangle.number: 4294967295 ; 0x014: 0xffffffff

一个 Oracle OTN 用户注意到kfed可以用于给ASM磁盘头重命名。 

这里希望它可以帮助别人。

免责声明... 如果你把自己的磁盘搞坏了,别怪我。

如果有任何问题,你可以发邮件给我:ramcda@hotmail.com 基本步骤是这样的:

- 编译 kfed - kfed转储磁盘头 - 更改转储文件 - 将转储写回磁盘头部。 ** 改变磁盘组名称以外的任何东西都会使你的磁盘失效。 下面这个脚本可以帮你运行:

for file in `ls /dev/vx/rdsk/as1_pccdw/asmdata*` do echo "Processing DATA disk $file ..." search=ASCDW_DATA replace=AS1CDW_DATA newlength=`echo $replace | wc -m` let newlength=$newlength-1 shortname=`echo $file | cut -f 6 -d /` kfed op=read dev=$file | sed -e '24,24s/ '$search' / '$replace' /' -e '24,24s/length=.*/length='$newlength'/' > /tmp/$shortname.kfed kfed op=write dev=$file text=/tmp/$shortname.kfed CHKSUM=YES done for file in `ls /dev/vx/rdsk/as1_pccdw/asmredo*` do echo "Processing REDO disk $file ..." search=ASCDW_REDO replace=AS1CDW_REDO newlength=`echo $replace | wc -m` let newlength=$newlength-1 shortname=`echo $file | cut -f 6 -d /` kfed op=read dev=$file | sed -e '24,24s/ '$search' / '$replace' /' -e '24,24s/length=.*/length='$newlength'/' > /tmp/$shortname.kfed kfed op=write dev=$file text=/tmp/$shortname.kfed CHKSUM=YES done