ORA-15040 根本原因是 ASM 无法识别全部成员磁盘,源于磁盘可见性、asm_diskstring 路径不匹配、磁盘头损坏或权限异常;须检查设备路径、AFD 状态、多节点一致性及 grid 权限,而非磁盘组名拼写。
ora-15040 不是磁盘组名冲突导致的,而是 asm 无法识别全部成员磁盘 —— 磁盘组“不完整”的根本原因永远在磁盘可见性、路径匹配或头信息层面,不是名字写错。
检查 asm_diskstring 是否匹配实际磁盘路径
这是最常见也最容易被忽略的配置错误。报错时 ASM_DISKSTRING 值为 'AFD:*',但系统里磁盘实际挂载在 /dev/asm*(如 /dev/asm-data01),ASM 就根本扫不到盘,自然判定磁盘组 incomplete。
- 用
ls -l /dev/asm*确认真实设备路径前缀 - 进
sqlplus / as sysasm执行show parameter asm_diskstring - 若不匹配,立即执行:
alter system set asm_diskstring='/dev/asm*' scope=both; - 再试
alter diskgroup DATA mount;—— 多数情况到这里就恢复了
确认 AFD 标签是否启用且状态正常
如果环境本意用 AFD(ASM Filter Driver),但标签没启用或状态异常,AFD:* 就会失效,asmcmd afd_lsdsk 显示所有磁盘为 CANDIDATE 或 DISABLED,这就是磁盘头损坏或 AFD 未接管的明确信号。
- 运行
asmcmd afd_lsdsk,观察HEADER_STATUS列:必须是MEMBER才有效 - 若为
CANDIDATE,说明磁盘头已损,需用afd_label重打标(仅限测试环境)或从备份恢复 - 若为
DISABLED,检查是否漏执行afddriverstate启动,或afd_configure未完成 - 不要强行
MOUNT FORCE—— AFD 环境下该命令无效,且可能掩盖真实路径问题
排查多节点间磁盘可见性与 reserve_policy 差异(RAC 场景)
RAC 中一个节点能 mount、另一个报 ORA-15040,大概率是存储层权限不一致。AIX 上典型问题是 reserve_policy 未设为 no_reserve,导致部分节点对同一 LUN 的 SCSI reservation 冲突,ASM 只能看到部分磁盘。
- 在各节点分别执行:
/usr/sbin/lsattr -E -l hdiskX | grep reserve_policy(AIX) - Linux 下检查 udev 规则或 multipath 配置是否在所有节点完全一致
- 确认
grid用户对所有 ASM 设备有读写权限:ls -l /dev/asm*和id -Gn grid - 特别注意补丁后
$ORACLE_HOME/bin/oracle属组是否被改回oinstall—— 必须是asmadmin,否则 ASM 权限校验失败
别被“磁盘组名”误导:ORA-15040 从不因拼写错误触发
有人看到 alert.log 里出现 diskgroup "DATA" cannot be mounted 就去查 v$asm_diskgroup.name 是否大小写/空格不一致,这是徒劳的。Oracle 对磁盘组名大小写不敏感,且校验发生在 mount 前的路径扫描阶段 —— 名字对不对,根本轮不到报 ORA-15040。
-
select name from v$asm_diskgroup只反映当前已 mount 的组,ORA-15040 出现时它很可能为空或不含目标组 - 真正要盯的是
v$asm_disk:看GROUP_NUMBER、STATE、HEADER_STATUS,尤其是PATH是否可访问 - 哪怕磁盘组名写成
"data"或"Data",只要磁盘路径通、头完好、冗余满足,mount 就不会卡在 ORA-15040
修复 ORA-15040 的关键,在于把“磁盘组不完整”翻译成具体可验证的动作:盘找不着?路径配错了?头坏了?权限卡住了?—— 每一步都得落到 ls、asmcmd、oerr 这些命令的输出上,而不是在 SQL 层猜名字或状态。


















