Oracle 12c RAC OHASD启动失败主因是systemd默认TimeoutStartSec(90秒)不足,导致进程被强制终止;需修改/usr/lib/systemd/system/ohasd.service中TimeoutStartSec=300并reload生效,同时验证OLR路径、私网HAIP及OCR磁盘组就绪状态。
oracle 12c rac 启动卡在 ohasd 阶段,不是服务没起来,而是 systemd 或 init 脚本等底层启动机制因超时主动 kill 掉了 ohasd 进程——必须改的是系统级超时,不是 oracle 内部参数。
为什么 crsctl start crs 会失败,但 ps -ef | grep ohasd 看不到进程
这是典型的“被系统杀死”现象。RHEL 7+ 使用 systemd 管理 ohasd,而默认的 TimeoutStartSec 值(通常为 90 秒)不足以让 ohasd 完成 OCR 加载、GPnP 初始化、HAIP 分配等重操作。systemd 在超时后直接终止进程并标记为 failed,日志里会出现 start-limit-hit 或 status=203/EXEC。
- 查证方式:
systemctl status ohasd输出中若含timeout、start-limit或failed,基本可确认 - 关键日志位置:
$GRID_HOME/log/,末尾往往停在/ohasd/ohasd.log CLSU-00100或ORA-00600,但没报错原因——因为进程已被杀,日志写不全 - 不要先去改
sqlnet.ora或grid_env:这些对 ohasd 启动无影响
如何修改 systemd 的 ohasd 启动超时值
必须编辑 systemd service 文件,而非 Oracle 自带的 /etc/init.d/init.ohasd。Grid 安装后,systemd 默认使用 /usr/lib/systemd/system/ohasd.service(部分版本为 ohas.service),该文件由 root.sh 生成,但未设超时容忍。
- 先确认服务名:
ls /usr/lib/systemd/system/ohas*.service,常见为ohasd.service或ohas.service - 编辑对应文件:
vi /usr/lib/systemd/system/ohasd.service - 在
[Service]段下添加两行:
[Service] TimeoutStartSec=300 RestartSec=30
-
TimeoutStartSec=300将启动等待上限提至 5 分钟,覆盖 GPnP wallet 解析、ASM diskgroup mount、私网 HAIP 初始化等长耗时环节 -
RestartSec=30避免 systemd 因快速失败循环重启(见start-limit-hit错误) - 执行:
systemctl daemon-reload && systemctl restart ohasd
改完还是起不来?重点检查这三个依赖是否真就绪
延长超时只是给 ohasd 更多时间,不代表它能绕过底层故障。若仍失败,说明阻塞点在 OCR/OLR、私网或 ASM 层,超时只是暴露了问题。
-
/etc/oracle/olr.loc必须存在且内容指向真实 OLR 文件;用ls -l $(cat /etc/oracle/olr.loc | awk '{print $2}')确认属主是root:oinstall、权限为644 - 私网 HAIP 必须能分配:运行
ifconfig -a | grep haip,若无输出,检查网卡状态、MTU 是否一致、交换机端口是否 UP;crsctl stat res ora.cluster_interconnect.haip -init应显示 ONLINE - OCR 所在磁盘组必须已 mount:若 OCR 在 ASM,先确保
ora.asm是 ONLINE 状态;否则asmcmd lsdg查看磁盘组是否 MOUNTED,再确认 voting disk 是否在其中
OHASD 启动失败最常被当成 Oracle 配置问题,其实九成是系统层或存储层没准备好。加超时只是争取排查时间,不是解决方案本身——真正卡住的从来不是时间,而是某个没 mount 的 diskgroup、一个被 SELinux 拦截的 socket,或者一块无法读取的 voting disk。











