Oracle RAC集群时间不一致时,必须先检查ctssd是否已退为observer mode:执行crsctl check ctss,若返回“CTSS is in observer mode”,说明CTSS已失效,需彻底清理NTP残留(停服务、禁自启、删除/etc/ntp.conf及pid文件),再重启ctssd并验证恢复active模式且offset稳定在±10ms内。
直接说结论:oracle rac集群时间不一致,不能只靠ntpdate手动校时,也不能让部分节点启着ntpd、部分关着——只要有一个节点的ntpd在跑且没按oracle要求配置,整个集群的ctssd就会退为observer mode,失去自适应同步能力,时间差会越滚越大。
检查 ctssd 是不是已经掉进 observer mode
这是最该先看的一步。别急着改配置,先确认当前同步机制是否已失效:
- 执行
crsctl check ctss,如果返回CTSS is in observer mode,说明 CTSS 已放弃控制权,正“看着” NTP 工作——但此时 NTP 很可能并不可靠 - 同时运行
date对比所有节点,差值超过 ±500ms 就已属高风险;超过 1s 就可能触发ORA-00600 [kgxgncv1]或实例拒绝启动 - 查日志:
tail -20 $GRID_HOME/log/`hostname`/ctssd/ctssd.log,留意Switching to observer mode或Failed to communicate with reference node类报错
禁用 NTP 前必须清干净残留
很多修复失败,是因为只停了服务,没删配置文件。Oracle 的判断逻辑很死板:/etc/ntp.conf 存在 = NTP 启用 = CTSS 必须 observer。
- 停服务:
systemctl stop ntpd(或service ntpd stop) - 关开机自启:
systemctl disable ntpd - 删配置:
rm -f /etc/ntp.conf(不是 mv,是 rm;mv仍会被识别为存在) - 删 pid 文件:
rm -f /var/run/ntpd.pid - 确认无残留进程:
ps -ef | grep ntp应无ntpd主进程(仅剩 grep 自身可忽略)
重启 ctssd 并验证 active 状态
清理完 NTP 后,CTSS 不会自动切换回 active,必须人工干预:
- 执行:
crsctl stop res ora.ctssd -init && crsctl start res ora.ctssd -init - 等 2–3 分钟,再运行
crsctl check ctss—— 正常应返回CTSS is in Active mode和一个毫秒级 offset(如Offset (in msec): 3) - 观察 10 分钟:
watch -n 10 'crsctl check ctss',确认 offset 波动稳定在 ±10ms 内,无跳变 - 注意:若仍显示 observer,说明某节点漏删了
/etc/ntp.conf,或用了chronyd(需同样停用并删/etc/chrony.conf)
非要共存 NTP 和 CTSS?那得按 Oracle 规则硬配
某些环境强制要求对接统一 NTP 服务器(如金融合规),这时 CTSS 可以保留 observer 模式,但 NTP 必须严格满足三个条件,否则照样漂移:
-
/etc/ntp.conf中必须含:tinker stepout 0和disable kernel -
/etc/sysconfig/ntpd中OPTIONS必须带-x(即OPTIONS="-x -u ntp:ntp"),禁用大步跳变 - 绝对禁止使用
ntpdate或chronyc makestep手动强校——它们会瞬间触发 >128s 跳变,直接踢出 CTSS - 验证连通性:
ntpq -p输出中,目标 server 行首应有*(主用)或+(备用),且offset长期维持在 ±5ms 内;若频繁出现disp> 100 或reach为 0,说明 UDP 123 端口被防火墙拦截
真正难的从来不是操作步骤,而是所有节点配置的一致性——少一个 -x、多一行未注释的 server、某个节点忘了删 ntp.conf,整个集群的时间信任链就断了。修完别只看单次结果,盯住 crsctl check ctss 输出至少半小时。











