ORA-15063错误在Oracle 19c RAC中表明ASM实例未识别目标磁盘,主因是asm_diskstring配置不当、设备权限错误或磁盘头残留;需通过v$asm_disk确认发现状态,显式设置asm_diskstring、统一udev命名、修正grid用户权限,并必要时用dd清理前4MB磁盘头。
ora-15063 错误在 oracle 19c rac 中几乎总是意味着 asm 实例根本没“看见”你认为它该看到的磁盘——不是磁盘坏了,而是发现路径(asm_diskstring)配置不当、权限错位或磁盘头残留导致的“视而不见”。
确认 ASM 是否真能发现目标磁盘
别急着改参数或删磁盘组,先看 ASM 自己“看到”了什么。连上 ASM 实例执行:
SELECT path, header_status, mode_status, state FROM v$asm_disk;
关键看三列:path 是否包含你期望的设备路径(如 /dev/mapper/datap1),header_status 是否为 MEMBER 或 PROVISIONED,state 是否为 NORMAL。如果某块盘完全没出现在结果里,说明它压根没被发现——问题一定出在 asm_diskstring 或底层权限上。
- 若
v$asm_disk返回空或只有部分盘,asm_diskstring极可能为空、错配或通配符失效 - 若盘出现在列表中但
header_status = PROVISIONED,说明磁盘未被加入任何磁盘组,但可被识别——此时创建磁盘组通常没问题 - 若
header_status = FORMER或CANDIDATE,说明磁盘曾属其他磁盘组或有残留元数据,需清理后重试
检查并修正 asm_diskstring 参数
asm_diskstring 是 ASM 扫盘的“搜索范围”,不是“自动猜路径”。19c 默认值为 NULL,理论上会扫描所有可读写块设备,但实际常因 udev 规则、ASMLIB 或权限问题失效。必须显式指定。
查当前值:
SHOW PARAMETER asm_diskstring;
常见错误配置:
-
ORCL:*:19c 中 ASMLIB 已弃用,此语法在非 ASMLIB 环境下基本无效 -
/dev/oracleasm/disks/*:仅适用于旧版 ASMLIB,19c RAC 多用 udev 或 multipath,路径应指向/dev/mapper/xxx或/dev/dm-* - 单节点设置后未同步到集群:RAC 中每个节点的 ASM 实例都需独立配置该参数
安全做法是明确列出所有磁盘路径(逗号分隔,不带空格):
ALTER SYSTEM SET asm_diskstring='/dev/mapper/datap1','/dev/mapper/datap2','/dev/mapper/frap1' SCOPE=BOTH SID='*';
注意 SID='*' 表示对所有 ASM 实例生效(RAC 必须加);SCOPE=BOTH 确保内存和 SPFILE 同时更新。
验证磁盘权限与设备路径一致性
即使 asm_diskstring 写对了,ASM 进程(运行用户通常是 grid)也必须对设备文件有读写权限。19c RAC 默认使用 grid:oinstall 用户启动 ASM。
检查设备权限:
ls -l /dev/mapper/datap1
正确输出应类似:
brw-rw---- 1 grid oinstall 253, 3 Apr 28 10:22 /dev/mapper/datap1
- 若属主不是
grid或组不是oinstall,用chown grid:oinstall /dev/mapper/datap1 - 若权限不是
brw-rw----,用chmod 660 /dev/mapper/datap1 - 若设备路径在各节点不一致(例如 node1 是
/dev/mapper/datap1,node2 是/dev/dm-3),必须用 udev 规则统一命名,否则 RAC 启动失败
udev 规则示例(/etc/udev/rules.d/99-oracle-asm.rules):
KERNEL=="dm-*", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="3600507680282004d0000000000000123", SYMLINK+="mapper/datap1"
清理磁盘头残留再重试
ORA-15063 常在重复建磁盘组后出现,尤其当之前用 dd 写过测试数据、或磁盘曾属其他 ASM 实例。ASM 不会覆盖已有有效头部,哪怕你执行了 DROP DISKGROUP ... FORCE,磁盘头部仍可能残留旧签名。
最稳妥的清理方式(在所有节点上对每块目标磁盘执行):
dd if=/dev/zero of=/dev/mapper/datap1 bs=4096 count=1000 conv=notrunc
这只会擦除前 4MB(足够覆盖 ASM 磁盘头和第一个 AU),不影响后续建组。切勿用 count=0 或全盘清零——既慢又没必要。
执行后重启 ASM 实例(srvctl stop asm -n node1; srvctl start asm -n node1),再查 v$asm_disk,正常应看到 header_status = CANDIDATE,此时即可用 CREATE DISKGROUP 安全重建。
真正卡住的地方往往不在命令本身,而在磁盘路径是否被所有节点以完全一致的方式识别——udev 规则写错一行,asm_diskstring 就永远找不到盘。











