跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

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

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_diskstring
:
sqlplus / 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*
是否指向真实块设备
kfod
和
asmcmd 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) 若磁盘状态为
PROVISIONED
或
CANDIDATE
,说明未加入磁盘组,需先执行
ALTER DISKGROUP DATA ADD DISK '/dev/asm-disk2'
切勿在缺失磁盘时强行
mount force
——ASM 允许挂载,但后续 I/O 可能静默失败,且无法保证数据一致性 磁盘组挂载问题最麻烦的从来不是命令输错,而是你看到的“磁盘不存在”,其实是 ASM 在某个环节被拦住了:可能是路径没对上,可能是权限卡在系统层,也可能是集群节点间状态撕裂。动手前,先用
kfod op=groups
看 ASM 自己认出了几个组,比盲目重启更省时间。

相关文章