74 ; 0x238: HOUR=0xa DAYS=0x1eMNTH=0x6 YEAR=0x7df
kfddde[1].crestmp.lo: 574201856 ; 0x23c: USEC=0x0 MSEC=0x268SECS=0x23 MINS=0x8
kfddde[1].failstmp.hi: 0 ; 0x240: HOUR=0x0 DAYS=0x0MNTH=0x0 YEAR=0x0
kfddde[1].failstmp.lo: 0 ; 0x244: USEC=0x0 MSEC=0x0SECS=0x0 MINS=0x0
kfddde[1].timer: 0 ; 0x248: 0x00000000
kfddde[1].size: 8189 ; 0x24c: 0x00001ffd
。。。。。。(略)
3. 根据以上信息,生成/dev/asm-disk2的磁盘头信息(这里可以通过/dev/asm-disk1的磁盘头信息修改)
[oracle@rac01 ~]$ kfed read /dev/asm-disk1aun=0 blkn=0 text=/home/oracle/asm-disk1.txt
利用编辑器打开生成的文件asm-disk1.txt,主要对应修改以下内容
原始的
kfbh.block.obj: 2147483648 ; 0x008: disk=0
kfdhdb.dsknum: 0 ; 0x024: 0x0000
kfdhdb.dskname: DATA_0000 ; 0x028: length=9
kfdhdb.fgname: DATA_0000 ; 0x068: length=9
kfdhdb.crestmp.hi:33020845 ; 0x0a8: HOUR=0xd DAYS=0x1dMNTH=0x6 YEAR=0x7df
kfdhdb.crestmp.lo:1437992960 ; 0x0ac: USEC=0x0 MSEC=0x182 SECS=0x1b MINS=0x15
kfdhdb.dsksize: 8189; 0x0c4: 0x00001ffd
kfdhdb.f1b1locn: 2 ; 0x0d4: 0x00000002
修改后的
kfbh.block.obj: 2147483649 ; 0x008: disk=1 (按顺序加1)
kfdhdb.dsknum: 1 ; 0x024: 0x0001 (参照kfddde[1].dsknum)
kfdhdb.dskname: DATA_0001 ; 0x028: length=9 (参照kfddde[1].dskname)
kfdhdb.fgname: DATA_0001 ; 0x068: length=9 (参照kfddde[1].fgname)
kfdhdb.crestmp.hi:33020874; 0x0a8: HOUR=0xd DAYS=0x1d MNTH=0x6 YEAR=0x7df (参照kfddde[1].crestmp.hi)
kfdhdb.crestmp.lo:574201856; 0x0ac: USEC=0x0 MSEC=0x182SECS=0x1b MINS=0x15 (参照kfddde[1].crestmp.lo)
kfdhdb.dsksize: 8189; 0x0c4: 0x00001ffd (参照kfddde[1].size)
kfdhdb.f1b1locn: 0 ; 0x0d4: 0x00000000 (因为asm-disk2为非file directory文件)
修改完成后,保存为新的文本名称为asm-disk2.txt,最后利用merge命令,写入/dev/asm-disk2磁盘头中,如下:
[oracle@rac01~]$ kfed merge /dev/asm-disk2 text=/home/oracle/asm-disk2.txt
?
来总结下利用merge修复的基本步骤,1.首先确认file directory的位置,再根据filedirectory找到dis directory的位置;2.根据disk directory找出磁盘信息,手工编辑磁盘头文件;3最后用kfed merge到对应的磁盘头中,生成磁盘头信息。
最后提一下,一般情况,file directory在磁盘组某个磁盘的au=2的位置,但是如果对磁盘组进行了增加和删除操作,就可能需要手工去查询了。
5.amdu工具使用
前面我们介绍了对磁盘头信息的修复,接下来我们介绍一个对存放在ASM里面的数据进行抽取的工具amdu。我们知道,如果asm实例是启动状态,我们可以通过asmcd或者rman命令将asm中的文件提取出来,但是如果asm无法启动的情况下,以上2个工具就无发实现了,这时候我们就可以用amdu来进行数据文件的抽取,这对于极端情况下的数据恢复是非常有帮助的。
AMDU是Oracle 11g里自带的一个免费的工具,用于分析ASM磁盘组的元数据以及从不能mount的磁盘组中往外抽取数据文件,它的原理就是跳过磁盘头直接解析磁盘中的filedirectory部分的内容,然后找到文件和目录结构,根据数据文件号,直接将文件抽取出来。因此,使用AMDU一般要满足以下三个情况:1.ASM实例无法启动;2.磁盘中的filedirectory信息完整;3.知道数据文件号;这样我们就可以尝试把数据文件直接抽取出来,在本地启动数据库实例,接下来我们来操作下。
1. 关闭ASM实例
[oracle@rac01~]$ sqlplus /nolog
SQL*Plus:Release 11.2.0.4.0 Production on Thu Jul 23 14:33:24 2015
Copyright(c) 1982, 2013, Oracle. All rightsreserved.
SQL>conn / as sysasm
Connected.
SQL>shutdown immediate;
ASMdiskgroups dismounted
ASMinstance shutdown
由于ASM中存放有CRS相关组件,因此CRS集群也被停止,整个数据库无法访问,如下
[oracle@rac01~]$ crs_stat -t
CRS-0184:Cannot communicate with the CRS daemon.
因为ASM实例没有启动,常用的asmcmd也无法访问相关的信息,如下
[oracle@rac01~]$ asmcmd
Connectedto an idle instance.
ASMCMD>ls
ASMCMD-8102:no connection to Oracle ASM; command requires Oracle ASM to run
过去遇到这种情况,我们只能想方设法的启动ASM实例,不然就只能通过备份文件恢复数据,现在我们可以尝试通过amdu工具,将数据文件直接抽取出来。
2. 利用ODU中的asmcmd工具查看数据文件号
由于ORACLE自带的ASMCMD工具无法使用,这时候我们就要借助牛人开发的ODU工具进行查看了,ODU是技术达人开发的一块收费的数据抽取工具(http://www.oracleodu.com/cn/download),我们只需要下载个试用版,用于查询下就行了。
[oracle@rac01~]$ tar -xvf odu_trial_413_linux_x86.tar
odu/
odu/asmdisk.txt
od