oracle rac磁盘组“只读挂载”实为权限缺失导致的写入失败,需检查/dev/oracleasm下设备属主(grid:asmadmin)、权限(0660)、$grid_home/bin/oracle的6751权限位及所有节点路径一致性。
oracle rac集群因权限错误导致磁盘组只读挂载,本质是asm无法完成磁盘头写入或ocr/voting disk元数据更新,不是“挂载模式”问题,而是权限缺失引发的降级行为。
确认是否真为只读挂载,还是根本没挂上
很多所谓“只读挂载”其实是误判——asmcmd lsdg 显示 MOUNTED 状态但实际无法创建数据文件,或 CREATE TABLESPACE 报 ORA-15097: cannot allocate memory for ASM buffer,这往往说明磁盘组虽显示已挂,但ASM进程因权限不足无法执行写操作。先验证真实状态:
- 运行
asmcmd lsdsk -k:若返回空或报ORA-15033: diskgroup 'DATA' is not mounted,说明根本没挂上,不是只读问题 - 查
grid用户下的$ORACLE_HOME/log/hostname/asmalert.log,搜索最近 5 分钟的ORA-15077、ORA-15110、ORA-15028(disk not readable) - 在 SQL*Plus 中以
/ as sysasm连接后执行SELECT state, type, total_mb, free_mb FROM v$asm_diskgroup;,若state是MOUNTED但type是EXTERN且无冗余路径,需立刻检查磁盘权限而非挂载参数
检查/dev/oracleasm下磁盘设备的属主与权限
OCR 和 Voting Disk 必须由 ASM 实例以 grid:asmadmin 身份打开并写入元数据。一旦设备属主变成 root:root 或 oracle:oinstall,ASM 就只能读盘头、无法写校验和,表现为“挂载成功但拒绝写入”,即你看到的“只读”假象。
- 所有节点执行
ls -l /dev/oracleasm/disks/,确认每个盘符(如DISK1)属主为grid:asmadmin,权限为0660 - 检查
/etc/sysconfig/oracleasm中ORACLEASM_UID=grid和ORACLEASM_GID=asmadmin是否匹配当前用户组;改完必须执行oracleasm force-scandisks再oracleasm scandisks - 若用 UDEV 映射,确保规则文件(如
/etc/udev/rules.d/99-oracle-asm.rules)含完整三要素:OWNER="grid"、GROUP="asmadmin"、MODE="0660",缺一不可
修复GRID_HOME/bin/oracle的setuid/setgid位
$GRID_HOME/bin/oracle 是 ASM 启动时真正调用的二进制,它必须具备 setuid grid 和 setgid asmadmin 权限,否则子进程无法继承 grid 身份去访问设备文件。误 chmod 后常出现“ASM实例能启,但磁盘组始终 DISMOUNTED”。
- 确认当前权限:
ls -l $GRID_HOME/bin/oracle应显示类似-rwsr-s--x(即4751或6751) - 若不匹配,先切到
grid用户,再执行:chmod 6751 $GRID_HOME/bin/oracle - 不要用
chown root:root改这个文件——它必须属grid:oinstall,且仅靠chmod恢复权限不够,得配合setasmgidwrap工具 - 手动触发重设:
$GRID_HOME/bin/setasmgidwrap o=$GRID_HOME/bin/oracle,该命令会校验并强制写入正确权限位
避免跨节点路径不一致引发的“伪只读”
RAC 不允许节点间磁盘路径不同。比如节点1看到的是 /dev/oracleasm/disks/DATA01,节点2看到的是 /dev/mapper/mpathc,即使权限全对,CRS 也无法同步磁盘组状态——结果就是只有发起挂载的节点显示 MOUNTED,其他节点仍是 DISMOUNTED,应用连上去发现表空间不可写,误以为“只读”。
- 所有节点执行
blkid | grep oracleasm和ls -l /dev/oracleasm/disks/,逐行比对输出是否完全一致(包括大小写、符号链接指向) - 禁用任何直接使用
/dev/sdX或/dev/mapper/xxx的裸设备配置;RAC 只认/dev/oracleasm/disks/*下的稳定别名 - 若已存在不一致,统一在所有节点执行
oracleasm deletedisk DISKNAME后重新createdisk,不要试图 ln -s 修补
最易被忽略的是节点间路径一致性——它不会报错,也不会进 alert 日志,只让 crsctl stat res ora.DATA.dg -p 里 PLACEMENT 字段为空,而你还在反复检查 chmod 和 chown。











