磁盘组挂载失败八成因asm未发现磁盘,须先执行asmcmd lsdsk -k验证内核路径一致性,检查udev规则、asm_diskstring配置及rac节点间设备路径、wwid、权限是否完全一致,再排查磁盘头状态与元数据损坏。

磁盘组挂载失败,八成不是磁盘坏了,而是ASM根本没看见磁盘——先别进SQL*Plus,退到操作系统层查物理可见性。
asmcmd lsdsk 无输出?说明 ASM 连设备路径都没扫到
这是最常被跳过的起点。asmcmd lsdsk 返回空或报 ORA-15033,代表 ASM 实例启动了,但扫描不到任何磁盘设备,属于“发现失败”,和磁盘组是否损坏无关。
- 立刻加
-k参数重试:asmcmd lsdsk -k,它强制走内核设备路径,能暴露节点间路径不一致问题(比如节点1是/dev/mapper/DATA01,节点2是/dev/sdb) - 若仍无输出,检查
/etc/udev/rules.d/99-asm-disk.rules是否存在且生效;执行udevadm trigger --subsystem-match=block和udevadm control --reload-rules - 确认所有节点上
blkid | grep -i data和ls -l /dev/mapper/ | grep data输出完全一致——差一个字符,RAC 就无法协调挂载
v$asm_disk 中磁盘缺失或 header_status 异常?查 asm_diskstring 和权限
如果 asmcmd lsdsk 有输出,但 asmcmd lsdg 看不到磁盘组,或挂载时报 ORA-15040、ORA-15042,说明磁盘已识别,但头部不可读或未组成组。
- 连
sqlplus / as sysasm查v$asm_disk:重点看path是否匹配你期望的设备(如/dev/mapper/datap1),header_status是否为MEMBER或PROVISIONED;若为CANDIDATE或FORMER,磁盘头大概率被覆盖 - 查
show parameter asm_diskstring:19c 默认为NULL,必须显式设置;安全写法是逗号分隔、无空格、指向真实设备,例如:'/dev/mapper/datap1','/dev/mapper/datap2';RAC 中需加SID='*'生效:ALTER SYSTEM SET asm_diskstring='...' SCOPE=BOTH SID='*' - 确认设备属主和权限:
ls -l /dev/mapper/datap1必须是grid:asmadmin且权限为brw-rw----(即0660);/etc/sysconfig/oracleasm中的ORACLEASM_UID和ORACLEASM_GID也需匹配
看到 ORA-15335 或 ORA-15196?元数据已损坏,别硬 mount
ORA-15335 几乎等于 ASM 元数据损坏;ORA-15196(如 invalid ASM block header)是磁盘头校验失败的铁证。此时 ALTER DISKGROUP MOUNT 必然失败,强行操作只会扩大风险。
- 用
kfed read /dev/mapper/DATA01 | grep kfbh.type看磁盘头类型:正常应为FKBTYP_DISKHEAD,若显示FKBTYP_INVALID,说明头块不可信 - 用
kfod disk=ALL dscv=TRUE查HEADER_STATUS:若为CANDIDATE,说明磁盘头被覆盖(比如有人在上面建了 LVM) - 元数据严重损坏时,跳过 ASM 实例直接抢救:
amdu -diskstring '/dev/mapper/*' -extract 'DATA.*' -destination /recovery;注意ORACLE_HOME必须指向 Grid Infrastructure
挂载前必须确认的三件事,漏一项就卡在 DISMOUNTED
不是执行了 ALTER DISKGROUP MOUNT 就能成功——底层链路断一环,整个流程就停住。
- 磁盘在每个 RAC 节点上必须有可读权限,且路径、WWID、权限三者完全一致;单节点能 mount 不代表集群能 mount
- +ASM 实例本身必须真正在运行:
ps -ef | grep asm_pmon比crsctl stat res -t更可信;$ORACLE_HOME/log/hostname/asmalert.log里最近 10 分钟不能有ORA-15110或ORA-15077 - OCR/Voting Disk 所在磁盘组必须已挂载;若它们处于
DISMOUNTED或DROPPED状态,其他磁盘组即使配置正确也无法挂载
真正卡住的地方,往往不是命令写错,而是节点间设备状态的细微差异——比如 udev 规则只在节点1 reload 了,或者某块盘的 blkid 输出多了一个空格。这种问题不会报明确错误,只会让挂载静默失败或只在单节点生效。











