能修,因magic损坏但物理扇区未覆写时,kfed仍可解析后续512字节关键字段;KFED-00322仅表示0x6B666564失效,备份头(如AU=4M时blkn=2046)完好即可用kfed repair恢复,但必须指定正确ausz参数且以root执行。
能修,但必须用对命令、对参数、对时机;kfed repair 不是万能膏药,填错 dsknum 或 ausz 会直接让磁盘组拒绝挂载。
为什么 kfed read 报 KFED-00322 错误却还能抢救
KFED-00322: Invalid ASM disk header block magic number 表示磁盘头前4字节 magic(0x6B666564)已损坏,但只要物理扇区没被覆写、LBA 0 后续512字节仍存有效结构,kfed 就可能解析出关键字段。前提是:磁盘未离线写入、没被 dd 清零、没被 LVM/分区工具覆盖。
常见误判点:
- 看到
header_status=CANDIDATE就认为“彻底报废”,其实只是 magic 失效,备份头还在 - 用普通用户执行
kfed read,报Permission denied,误以为工具失效,实则是权限问题 - 在 ASM 实例仍在运行时反复
kfed read,缓存污染导致state字段不准,应先ALTER DISKGROUP ... DROP DISK或停实例
kfed repair 命令必须带 ausz 参数
Oracle 从 10.2.0.5 起在第二个 AU(AU 1)倒数第二个 block 中自动备份磁盘头,比如 AU=4M 时,备份块位置是 blkn=2046(计算公式:(ausize / 512) * 2 - 2)。kfed repair 就是读这个备份块,重写到 LBA 0。
但 repair 操作不自动推导 AU 大小,必须显式指定 ausz,否则默认按 1M 处理,导致元数据错位:
- AU=1M →
kfed repair /dev/sdi ausz=1048576 - AU=4M →
kfed repair /dev/sdi ausz=4194304 - AU=8M →
kfed repair /dev/sdi ausz=8388608
验证是否成功:修复后立即 kfed read /dev/sdi | egrep 'kfbh.type|dsknum|grpname',确认 kfbh.type 显示 KFBTYP_DISKHEAD,且 dsknum、grpname 与原磁盘一致。
merge 和 repair 的适用边界在哪
kfed merge 是把一个外部头文件(如 header.bak)完整覆盖到磁盘开头,适用于:有完好磁盘的头备份、或从同环境其他磁盘提取的头模板;而 kfed repair 是调用磁盘自身备份块,更安全、无需外部依赖。
用 merge 的风险极高:
-
dsknum填错 → ASM 认为这是新盘,触发 rebalance,可能丢数据 -
grpnum填错 → 磁盘无法归属原 diskgroup,mount直接报ORA-15018 -
fgrpnum填错 → 冗余策略失效,后续ADD FAILGROUP失败 - 没加
chksm=yes→ checksum 校验失败,ASM 拒绝识别
正确做法:优先用 repair;仅当备份块也损坏(kfed read /dev/sdi blkn=2046 返回全 0 或乱码)时,才考虑 merge,且模板必须来自同一版本、同 AU 设置、同冗余类型的磁盘。
amdu 在什么情况下必须上
当 kfed read /dev/sdi 和 kfed read /dev/sdi blkn=2046 都返回空或无效内容(如全 0x00),说明磁盘头及备份块均不可读,此时 kfed 已无用武之地。
amdu 是唯一选择,因为它不依赖磁盘头,而是扫描整块磁盘寻找 ASM 元数据块(AU 内的 KFBTYP_FILEDIR、KFBTYP_ALIASKDIR 等),能重建 alias、file directory,甚至导出具体数据文件:
- 导出 SYSTEM 表空间:
amdu -diskstring '/dev/sd*' -dump data.256 - 只抽控制文件:
amdu -diskstring '/dev/sd*' -search 'CONTROLFILE' - 输出所有发现的文件路径:
amdu -diskstring '/dev/sd*' -list
注意:amdu 输出的是原始 AU 数据,需配合 strings 或解析脚本还原路径,不能直接挂载;它解决的是“数据能不能捞出来”,不是“磁盘能不能重新上线”。
最易被忽略的一点:所有 kfed 操作必须用 root 或 grid 用户执行,且目标磁盘不能被任何进程 open(包括 ASM 实例、ASMLIB、AFD);哪怕只是 kfed read,如果磁盘正被挂载,也可能读到脏缓存而非真实磁盘内容。











