ORA-29701 错误的核心原因并非数据库层面的配置失误,而是底层集群同步服务或高可用服务尚未完成初始化。在 Oracle 12c RAC 环境中遭遇此错误时,直接重启实例或修改数据库参数通常无效。正确的解决思路应是优先确认并修复 ohas/css 的存活状态——这是问题的根本所在。

验证 ohasd 进程的真实运行状态
crsctl check has 的返回结果有时并不可靠,若 IPC 通信中断,它可能产生假阳性的输出。更可靠的判断方法需要执行以下步骤:
- 执行
ps -ef | grep ohasd,确认是否存在由 root 用户启动的/u01/app/12.1.0/grid/bin/ohasd进程(务必注意路径中的版本号与实际安装版本一致)。 - 检查
/var/tmp/.oracle/目录下是否存在socket文件,以及OCSSD_LL_类型的 socket 是否可正常访问,例如_crs ls -l /var/tmp/.oracle/OCSSD*。 - 若进程缺失,或 socket 文件为空、属主异常(非 root:root),则说明 OHAS 初始化失败。此步骤不解决,后续对 OCR 的诊断均无意义。
核实 OLR(Oracle Local Registry)是否可用
在 12c RAC 中,集群启动依赖的是 OLR 而非 OCR,OLR 用于定位本地的集群元数据。OLR 失效的常见情形包括:
/etc/oracle/olr.loc文件缺失、权限不是 644,或文件中指向的设备无法读取(例如olrconfig_loc=+OCR_VOTE但 ASM 实例尚未启动)。- OLR 所在的磁盘组处于离线状态,或执行
ocrcheck -local时出现错误 “PROT-22: Failed to retrieve data from the local registry”。 - 手动重建 OLR 前,必须先彻底清除所有残留进程:使用命令
/u01/app/12.1.0/grid/crs/install/rootcrs.pl -deconfig -force -verbose,不应再使用已过时的roothas.pl。
排查私网与 IPC 层级的阻断问题
即便网络可以 ping 通,CSS 仍可能因底层通信失败而报 ORA-29701。此时需要检查以下几个容易忽略的细节:
- 私网接口的防火墙(firewalld/iptables)是否阻止了 Unix socket 的创建?可通过
getenforce确认 SELinux 状态,临时设为 permissive 可快速验证。 - 确认
/dev/shm挂载正常且空间充足(df -h /dev/shm)。CSS 依赖共享内存段进行通信,此环节不可出错。 - 查看
$GRID_HOME/log/,搜索 “IPC connect failed”、“CLSC_” 或 “kgxgncin” 等错误信息。相比 alert.log,该日志能够更早揭示连接失败的根源。/cssd/ocssd.log
切勿忽视 udump 和 /var/tmp 空间耗尽问题
这并非“罕见的边缘情况”,在 12c 中,它实际上是高频诱因——特别是在启用 SQL Trace、ADDM 或自动任务时。处理思路如下:
- 执行
df -h /u01/app/oracle/diag/rdbms/与/ /trace df -h /var/tmp。若任一使用率达到 95% 以上,应立即清理旧的 trace 文件,例如使用find . -name "*.trc" -mtime +7 -delete。 - 特别关注
udump目录下是否存在单个超过 2GB 的 trace 文件。这种情况常因DBMS_MONITOR.DATABASE_TRACE_ENABLE未关闭导致。 - 清理完空间后,必须重启
ohasd:先使用kill -9杀掉残留进程,再运行/u01/app/12.1.0/grid/bin/crsctl start has。
在整个排查过程中,最容易被忽略的步骤是验证 socket 文件权限和 /dev/shm 的状态。它们通常不会直接报错,但会导致 ohasd 静默失败。一旦跳过这两步,后续所有对 OCR 的检查、资源的启动都将建立在无效前提之上,徒劳无功。
