磁盘组挂载失败时,首要排查asm是否发现磁盘:若asmcmd lsdsk无输出,说明asm未扫描到任何磁盘,属发现失败而非磁盘损坏;需用lsdsk -k验证内核路径一致性,并检查udev规则、权限及节点间设备状态是否完全一致。
磁盘组挂载失败时,先别急着启动数据库实例
实例无法启动的直接原因,往往不是数据库本身出错,而是它依赖的asm磁盘组根本没挂上。比如报 ora-01565、ora-17503 或 ora-15001: diskgroup "data" does not exist or is not mounted,基本可以锁定是 data 或 flash_recovery_area 这类存放参数文件、控制文件、数据文件的磁盘组处于 dismounted 状态。
实操建议:
- 切到
grid用户,用sqlplus / as sysasm连本地ASM实例,查select name, state from v$asm_diskgroup;—— 不要只信crsctl stat res -t,它可能显示资源 online,但 ASM 实际已僵死 - 若输出为空或全是
DISMOUNTED,立刻停掉后续所有数据库启动动作,先解决ASM层问题 - 注意:RAC中每个节点的ASM实例是独立的,节点1能 mount,不代表节点2也能——必须逐节点检查
asmcmd lsdsk 无输出?说明ASM连磁盘都没看见
asmcmd lsdg 看不到磁盘组,第一反应不该是“磁盘坏了”,而是“ASM 根本没发现磁盘”。这是最常被跳过的物理层验证点。
实操建议:
- 运行
asmcmd lsdsk:若返回空或报ORA-15033: diskgroup 'DATA' is not mounted,说明 ASM 扫描不到任何磁盘设备 - 加
-k参数重试:asmcmd lsdsk -k,它会强制走内核设备路径,暴露权限/路径不一致问题(比如节点1看到/dev/mapper/DATA01,节点2看到/dev/sdb) - 若
lsdsk -k仍无输出,检查udev规则是否生效:udevadm trigger --subsystem-match=block+udevadm control --reload-rules,再确认/etc/udev/rules.d/99-asm-disk.rules存在且内容正确(OWNER="grid"、GROUP="asmadmin"、MODE="0660")
磁盘可见但磁盘组挂不上?重点查 header 状态和权限
如果 asmcmd lsdsk 有输出,但 lsdg 没有,或挂载时报 ORA-15040: diskgroup is incomplete,说明磁盘已识别,但 ASM 无法读取其头部(disk header)或组成有效组。
实操建议:
- 查
v$asm_disk中对应磁盘的HEADER_STATUS:若为CANDIDATE或PROVISIONED,大概率是磁盘头损坏;FOREIGN则可能是跨平台迁移未做ALTER DISKGROUP ... IMPORT FOREIGN - 用
kfed read /dev/mapper/DATA01 | grep kfbh.type确认磁盘头类型:正常应为FKBTYP_DISKHEAD,若显示FKBTYP_INVALID,需用kfed repair恢复(前提是 AU 备份块完好) - 检查设备权限:
ls -l /dev/mapper/DATA01必须是brw-rw---- 1 grid asmadmin;/dev/oracleasm/disks/DISK1同理,属主不能是root:root或oracle:oinstall - 确认
asm_diskstring参数值在所有节点完全一致:show parameter asm_diskstring,且不含重复路径(如同时含/dev/mapper/*和/dev/dm-*)
RAC节点间状态不一致?CRS 就会拒绝协调挂载
RAC 要求所有节点对同一磁盘的路径、WWID、权限、UDEV 映射结果**逐字节一致**。哪怕节点2的 blkid 输出多一个空格,CRS 也会认为该节点“不可信”,导致磁盘组只能在单点挂载,其他节点始终 DISMOUNTED。
实操建议:
- 在所有节点并行执行:
blkid | grep -i data、ls -l /dev/mapper/ | grep data、ls -l /dev/oracleasm/disks/,手动比对每行输出是否完全相同 - 检查 OCR/Voting Disk 所在磁盘组是否已 mount:
crsctl query css votedisk中 STATE 必须全为ONLINE;若某节点显示OFFLINE,先用dd if=<votedisk_path> of=/dev/null bs=4k count=1</votedisk_path>测试 I/O 通路 - 确认磁盘组的
AUTO_START属性设为always:crsctl stat res ora.DATA.dg -p | grep AUTO_START,若为never,执行crsctl modify resource ora.DATA.dg -attr "AUTO_START=always"
真正卡住人的地方,往往不是 SQL 命令写错,而是 asmcmd lsdsk 在节点 A 正常、节点 B 返回空——这时再翻 alert 日志已经晚了,得立刻切到操作系统层比对设备状态。











