能修,因KFED-00322仅表示磁盘头magic(0x6B666564)损坏,物理扇区未覆写时备份头(如AU=4M时blkn=2046)仍完好,kfed repair可据此恢复,但必须以root执行、显式指定正确ausz参数,修复后需用asmcmd afd_lsdsk确认AFD接管状态。
能修,但必须用对命令、对参数、对时机。 kfed-00322 错误只是磁盘头 magic 字段(0x6b666564)损坏,物理扇区未覆写时,备份头仍可读取;kfed repair 就是靠它恢复,不是靠猜。
为什么 kfed read 报 KFED-00322 却还能抢救
KFED-00322: Invalid ASM disk header block magic number 表示 LBA 0 头块前 4 字节失效,但只要没被 dd 清零、没被 multipath 或 LVM 工具覆盖、ASM 实例也没在运行中反复扫描,后续 512 字节里关键字段(如 dsknum、grpname、fgrpnum)大概率还在。
常见误判点:
- 看到
header_status=CANDIDATE就删盘重加——其实是 magic 坏了,备份头完好 - 用普通用户跑
kfed read,报Permission denied就放弃——得切root - 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。
但它不自动推导 AU 大小,填错直接让磁盘组拒绝挂载:
- 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)整个覆盖到 LBA 0,风险极高:
-
dsknum填错 → ASM 当成新盘,触发 rebalance,可能丢数据 -
grpnum填错 → 磁盘无法归属原 diskgroup,mount直接报ORA-15018 - 漏加
chksm=yes→ checksum 校验失败,ASM 拒绝识别
正确做法:优先用 kfed repair;仅当 kfed read /dev/sdi blkn=2046 返回全 0 或乱码(说明备份块也坏了),才考虑 merge,且模板必须来自同一版本、同 AU 设置、同冗余类型的磁盘。
最易被忽略的一点:repair 后别急着 alter diskgroup mount,先用 asmcmd afd_lsdsk 确认 AFD 已接管该盘(状态为 a),否则 ASM 实例根本看不到它——19c RAC 下,asmfd 是发现路径的第一道关卡。











