crsctl无法让节点退出维护模式的根源是底层状态卡在unknown/offline且资源未释放,常见于强制断电、crsctl stop crs后未等服务完全下线即关机,或ctssd因时间偏差>600秒被中止导致css层无法完成清理。
crsctl 无法让节点退出维护模式,不是命令没输对,而是底层状态卡在“unknown”或“offline”但资源未真正释放——常见于强制中断、断电、crsctl stop crs 后未等服务完全下线就关机,或时间不同步导致 ctssd 拒绝参与集群协商。
crsctl check crs 显示失败但节点实际已关机
这种情况说明 CRS 进程虽已终止,但 OCR/Voting Disk 上残留了该节点的注册信息,其他节点仍试图与其通信。此时不能直接 crsctl start crs,否则会报 CRS-4639: Could not contact Oracle High Availability Services 或反复触发 OCR initialization failed。
- 先确认节点物理状态:用
ps -ef | grep crs和ps -ef | grep ocssd确保无残留进程 - 检查 OCR 中该节点是否仍被标记为 active:
ocrcheck -config+crsctl query css votedisk - 若节点已彻底离线(比如刚重装系统),必须用
crsctl delete node -n <nodename></nodename>(grid 用户执行)从集群元数据中清除它 - 执行前确保 OCR 可写且有备份:
ocrconfig -showbackup,必要时先ocrconfig -manualbackup
crsctl stop crs 后节点状态卡在 UNKNOWN
这是最典型的“假停机”:OCSSD 进程已退出,但 crsctl check crs 仍返回 CRS-4639,且 crsctl status resource -t 显示部分资源为 UNKNOWN。根本原因往往是:
-
ctssd因时间偏差 >600 秒被强制 abort,导致 CSS 层无法完成 clean shutdown 流程 -
ohasd进程僵死(ps -ef | grep ohasd查看是否存在但无响应) - /var/tmp/.oracle/ 下残留 IPC socket 文件未清理(如
s#12345678类型文件)
处理步骤:
- 手动 kill 僵死进程:
kill -9 $(pgrep -f "ohasd|ocssd|evmd") - 清空 IPC 临时目录:
rm -f /var/tmp/.oracle/s* - 删除本地 CRS 状态缓存:
rm -f /u01/app/grid/crsdata/<nodename>/crsconfig_dir/*</nodename> - 再次执行
crsctl stop crs,观察日志是否出现CRS-2793: Shutdown of Cluster Ready Services was initiated—— 这才是真退出
维护后重启节点,crsctl start crs 卡在 “Starting CRS stack” 阶段
这不是启动慢,是卡死。典型表现是 crsctl check crs 长时间无返回,tail -f $GRID_HOME/log/<nodename>/crsd/crsd.log</nodename> 最后一行停在 CRS-2775: Starting Oracle Clusterware stack。
关键检查点:
-
/sys/kernel/mm/transparent_hugepage/enabled必须为[never],否则ohasd启动时因大页冲突直接 hang 住 -
systemctl show --property DefaultTasksMax必须为infinity,否则 fork 子进程失败,crsd无法派生子服务 -
cat /proc/sys/fs/aio-max-nr应 ≥ 1048576;若为默认 65536,cssd初始化 AIO 时会超时退出 - 时间同步未就绪:
ntpq -p要看到至少一个*或+的源,且ntpstat显示synchronised to NTP server
真实运维中,节点“看似退出维护但集群不认账”,往往不是某一步操作错了,而是多个底层约束同时未满足:时间没对齐、THP 没禁掉、aio-max-nr 太小、DefaultTasksMax 还是默认值——四者只要缺一,crsctl 就会沉默卡死,连错误日志都不写全。











