节点重启是集群心跳机制触发的驱逐结果,因ocssd.bin心跳超时(gipcretTimeout/misscount)导致主节点判定失联;需结合ocssd.log、/var/log/messages及系统指标排查网络抖动、CPU争用或存储延迟等根因。

业务高峰期节点重启,基本不是数据库实例本身的问题,而是集群心跳机制被触发驱逐(node eviction)的结果。核心原因在于:ocssd.bin 进程无法在规定时间内完成网络或磁盘心跳,导致主节点判定该节点“失联”,进而强制重启以保集群一致性。
查 ocssd.log 里有没有 gipcretTimeout 或 misscount 超限记录
这是最直接的证据。高峰期网络抖动、CPU争用或存储延迟升高,都会让 ocssd.bin 的心跳包发送/接收失败:
-
gipcretTimeout出现在日志里,说明 GIPC(Grid Infrastructure Private Communication)层已超时,大概率是私网通信卡顿或中断 - 如果看到类似
misscount reached for node X,说明连续 30 秒(默认值)没收到其他节点心跳,触发驱逐流程 - 注意时间戳是否与业务高峰完全吻合——比如每到下午 2–4 点集中出现,那基本可锁定是资源瓶颈而非偶发故障
对比 /var/log/messages 和 ocssd.log 的时间线
操作系统日志常被忽略,但它能暴露底层真实问题:
- 在
ocssd.log中驱逐发生前 1–2 分钟,/var/log/messages是否有kernel: net_ratelimit: XXX callbacks suppressed?这是内核丢包警告,指向私网拥塞 - 是否有
EDAC MC或Machine Check Exception?说明硬件级错误(如内存 ECC 报错),高峰期负载加重后暴露 - 是否有
ocssd.bin被 OOM killer 杀掉的痕迹?Out of memory: Kill process <code>ocssd.bin是典型信号,说明系统内存不足,ocssd 优先级再高也扛不住
检查 crsctl check cluster -all 和 olsnodes -n -i -s 的输出差异
这不是事后排查,而是验证当前配置是否埋雷:
-
crsctl check cluster -all显示所有节点 “CRS-4638” 是正常的,但不代表心跳健康;它只说明 CRS 进程活着 -
olsnodes -n -i -s才反映真实状态:Unreachable表示网络心跳断了,Unknown往往是磁盘心跳异常(比如表决盘 I/O 延迟飙升) - 特别注意
misscount和disktimeout当前值:crsctl get css misscount,默认 30 秒对高负载私网太激进,有些客户调到 60 秒才稳定
别漏掉 oprocd 和 cssdagent 日志里的隐性线索
在较老版本(如 10.2/11.2)或 HP-UX 环境中,oprocd(Oracle Process Monitor Daemon)仍参与节点存活判断:
-
/etc/oracle/oprocd/*.log.*里若出现fatal mode startup或skewTimeout触发,说明本地时钟偏移过大,ocssd 心跳时间戳校验失败 -
cssdagent日志(路径类似$GRID_HOME/log/<node>/cssd/cssdagent.log)中若有大量Failed to send heartbeat to CSSD,说明 agent 与 ocssd 通信已中断,不一定是网络问题,更可能是 ocssd 进程卡死或 CPU 被抢占 - 高峰期 CPU 使用率长期 >95%,
ocssd.bin因为是 RT(real-time)进程虽有优先级,但若内核调度器被压垮,它照样收不到调度时间片
真正难处理的不是日志里明写的错误,而是那些“看起来正常却刚好卡在临界点”的情况:比如私网延迟从 0.2ms 涨到 28ms,没丢包但反复超时;或者表决盘 I/O 平均等待从 5ms 升到 198ms,刚好低于 disktimeout 阈值但远高于健康水位。这些都需要结合 OSWatcher 或 SAR 数据交叉比对,单看 Oracle 日志会漏掉关键上下文。


















