如果自己搞不定可以找诗檀软件专业ORACLE数据库修复团队成员帮您恢复!
诗檀软件专业数据库修复团队
服务热线 : 13764045638 QQ号:47079569 邮箱:service@parnassusdata.com
问:我听说过未公开的KFED(内核文件编辑器)实用程序。你能解释一下KFED如何运行吗?
答:kfed是一款未公开的ASM实用程序,用于读取和修改ASM实例。所以它可以与挂载或是卸载的磁盘一起使用。
kfed在Oracle 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
Comment