如何排查ASM磁盘未挂载问题_kfod工具与asm_diskstring路径扫描

1次阅读

kfod 扫不到磁盘的根本原因是 ASM 无法按 asm_diskstring 配置“看到”它,而非设备未识别;需检查该参数值、UDEV/ASMLIB 配置、权限及磁盘头状态。

为什么 kfod 扫不到磁盘,但 /dev/sdb1 明明存在?

根本原因不是设备没识别,而是 asm 无法按当前配置“看到”它。asm 不直接读 /dev/sdb1,它依赖 asm_diskstring 参数定义的路径模板去扫描,再结合 asmlib 或 udev 规则映射为合法磁盘。如果 asm_diskstring 配置为空、路径写错、权限不足或 asmlib 未就绪,kfod 就会返回空——这不是磁盘丢了,是“门关着”。

  • kfod disk=all 返回空,先别急着重启 ASM,先查 asm_diskstringsqlplus / as sysasm -c "show parameter asm_diskstring"
  • 常见错误值:'ORCL:*'(依赖 ASMLIB)、'/dev/oracleasm/disks/*'(旧版 ASMLIB 路径)、'/dev/asm-disk*'(UDEV 规则路径),必须与实际磁盘符号链接位置严格一致
  • 若用 UDEV,确认规则文件(如 /etc/udev/rules.d/99-oracle-asm.rules)已生效:udevadm control --reload-rules && udevadm trigger,再检查 ls -l /dev/asm-disk* 是否指向真实块设备

kfodasmcmd lsdsk 结果不一致怎么办?

kfod 是底层发现工具,绕过 ASM 实例,只做路径扫描和头校验;asmcmd lsdsk 则依赖 ASM 实例已启动且能访问磁盘元数据。两者不一致,说明磁盘物理可达但元数据异常或实例未加载完整。

  • kfod 能扫出磁盘但 asmcmd lsdsk 无输出:大概率是 ASM 实例没起来,或 +ASM 进程未获得磁盘读权限(ls -l /dev/asm-disk* 看属主是否为 grid:asmadmin
  • kfod 无输出但 asmcmd lsdsk 有结果:极罕见,通常是 ASM 实例缓存了旧磁盘信息,需重启 ASM 并清空 $ORACLE_BASE/diag/asm/+asm/asm/trace/ 下的最近 trace 文件
  • 验证磁盘头是否有效:kfod op=validate ds=true dev=/dev/asm-disk1 —— 若报 Invalid ASM disk header,说明元数据损坏,不能强挂载

修改 asm_diskstring 后仍不生效?注意三个隐性依赖

改完参数不等于立刻生效。ASM 实例不会动态重读该参数,且它还受 OS 层、驱动层、集群注册状态三重约束。

  • 必须重启 ASM 实例:srvctl stop asm -n $(hostname) && srvctl start asm -n $(hostname)(RAC 环境下要逐节点操作)
  • ASMLIB 必须已加载且 /dev/oracleasm 已挂载:oracleasm status 输出必须含“loaded”和“mounted”,否则 ORCL:* 类路径永远失败
  • RAC 环境下,ocrcheck 必须通过,且所有节点的 asm_diskstring 值必须完全一致,否则某节点挂载成功,另一节点因扫描路径不同而报 ORA-15063: ASM discovered an insufficient number of disks

挂载失败时,日志里反复出现 no PST quorum 怎么办?

这不是配置问题,是仲裁机制触发的保护行为。PST(Physical Sector Table)是 ASM 磁盘组的元数据仲裁结构,外部冗余要求至少 2 块磁盘在线才能形成 quorum;正常冗余需半数以上;高冗余需三分之二以上。少一块,就卡在这里。

  • 查实际在线磁盘数:asmcmd lsdsk -k(显示 header_status = MEMBER 的才算有效参与 quorum)
  • 若磁盘状态为 PROVISIONEDCANDIDATE,说明未加入磁盘组,需先执行 ALTER DISKGROUP DATA ADD DISK '/dev/asm-disk2'
  • 切勿在缺失磁盘时强行 mount force——ASM 允许挂载,但后续 I/O 可能静默失败,且无法保证数据一致性

磁盘组挂载问题最麻烦的从来不是命令输错,而是你看到的“磁盘不存在”,其实是 ASM 在某个环节被拦住了:可能是路径没对上,可能是权限卡在系统层,也可能是集群节点间状态撕裂。动手前,先用 kfod op=groups 看 ASM 自己认出了几个组,比盲目重启更省时间。

text=ZqhQzanResources