能,kfed可读出原始结构,前提是磁盘物理完好且头部未被覆写;它直接读取LBA 0的1024字节,前512字节有效,magic号(0x6B666564)损坏会导致KFED-00322错误,但后续信息可能仍可用。
ASM磁盘头损坏后,kfed还能读出原始结构吗?
能,但前提是磁盘物理未坏、头部未被覆写。asm磁盘头固定在lba 0(第一个扇区),kfed直接读取该位置的1024字节元数据;只要这512字节(实际有效头是前512字节)没被dd清零或覆盖,kfed read大概率能解析出ausize、disk number、failgroup等关键字段。
常见错误现象:kfed read /dev/oracleasm/disks/DISK01报错KFED-00322: Invalid ASM disk header block magic number——说明magic(0x6B666564)已损坏,但后续扇区可能仍存有可用信息。
- 必须用root或ASMLIB权限运行,普通用户会提示
Permission denied - 别对裸设备执行
kfed repair,它不校验逻辑一致性,强行写入可能让ASM实例拒绝挂载 - 若磁盘已加入diskgroup且实例在线,先
ALTER DISKGROUP ... DROP DISK再操作,否则kfed读出的state字段可能被缓存污染
用kfed merge恢复磁盘头时,哪些字段绝对不能填错?
kfed merge本质是把一个“模板头”覆盖到目标磁盘开头,它不智能推导参数,全靠你提供正确值。填错任意一项,ASM实例启动时就会报ORA-15018: diskgroup cannot be created或挂载失败。
必须核对的字段(从完好磁盘用kfed read提取):
-
dsknum:必须与原磁盘编号一致,否则ASM认为这是新盘,可能触发rebalance -
grpnum:对应diskgroup的group number,错则无法归属到原有DG -
ausize:单位字节(如1M=1048576),与CREATE DISKGROUP ... ATTRIBUTE 'au_size'='1M'严格匹配 -
fgrpnum:failgroup编号,多副本场景下影响冗余分布,填错会导致ALTER DISKGROUP ... ADD FAILGROUP失败
示例:从备份头文件header.bak恢复时,命令为kfed merge /dev/oracleasm/disks/DISK01 fname=header.bak,其中header.bak必须是同一环境、同版本ASM生成的头备份。
当kfed完全失效,为什么优先选amdu而不是strings或dd手工拼?
amdu是Oracle官方工具,它不依赖磁盘头,而是扫描整个磁盘寻找ASM元数据块(AU中的metadata block),自动识别alias directory、file directory、甚至data file extent map。而strings /dev/xxx | grep ORCL只能捞出碎片化路径名,dd手工拼header则是赌运气。
使用场景明确:
- 磁盘头彻底损坏(
kfed read返回全0或乱码) - 需要导出具体数据文件(如SYSTEM表空间),而非仅修复磁盘
- ASM实例已无法启动,但磁盘物理可读
注意:amdu输出的是二进制镜像(.img),需配合dd和偏移计算才能提取单个文件;它不修改源磁盘,但扫描过程IO压力大,建议在非业务时段运行。
amdu导出的文件如何映射回真实数据文件名?
amdu本身不还原文件名,它只按ASM内部编号(file_number)导出amdu_0123456789.img。要查到对应SYSTEM01.DBF这类名字,得结合amdu生成的report.txt和ASM字典视图(如果还能连上实例)或历史备份。
关键步骤:
- 运行
amdu -diskstring '/dev/oracleasm/disks/*' -dump DG_NAME,生成report.txt - 在
report.txt里搜索File Number,找到目标文件的Block Size和Size(以AU为单位) - 若实例尚可访问,查
select name, file_number from v$asm_alias where file_number = 256;(256是SYSTEM的典型编号) - 若实例不可用,从RMAN备份中提取
LIST BACKUP OF DATABASE记录,比对SET_STAMP和FILE#
容易忽略的点:amdu导出的文件不含文件头(如DBF的SCN、checkpoint信息),直接cp到数据库目录下无法open,必须用RMAN RESTORE或BBED修补头——这才是真正卡住恢复进度的地方。










