CTSS服务异常导致时钟漂移,因CTSS退为observer模式后依赖NTP;若NTP配置不一致或宕机,则节点间时间差增大,引发ORA-00600等错误。需禁用NTP并重启ctssd,或严格按Oracle要求配置NTP(tinker stepout 0、disable kernel、OPTIONS="-x"),确保offset±5ms内,并验证UDP 123端口连通性及硬件时钟同步。
CTSS 服务状态异常导致时钟漂移
oracle rac 集群里,ctssd(cluster time synchronization service)会自动接管时间同步——但前提是它处于 active 状态。一旦发现节点间 crsctl check ctss 返回 ctss is in observer mode,说明 ctss 主动退让,把控制权交给了外部 ntp,而这时如果 ntp 配置不一致或服务宕了,时钟就立刻开始漂移。
常见错误现象:crsctl check ctss 显示 observer mode、date 在各节点差几秒甚至几十秒、oerr ora 1092 或实例意外重启后出现 ORA-00600: internal error code, arguments: [kgxgncv1] 类似报错。
- 检查前先确认是否人为启用了 NTP:运行
ps -ef | grep ntpd或systemctl status ntpd;若存在且未统一配置,CTSS 必退为 observer - 禁用 NTP 后重启
ctssd:执行crsctl stop res ora.ctssd -init→crsctl start res ora.ctssd -init - 观察 2–3 分钟,再运行
crsctl check ctss,应返回CTSS is in active mode
NTP 配置与 CTSS 共存的硬性条件
Oracle 官方允许 NTP 和 CTSS 共存,但仅限于“NTP 仅校准硬件时钟(RTC),不干预系统时钟(sysclock)”,否则 CTSS 会持续 fallback 到 observer 模式。这要求 NTP 必须启用 tinker stepout 0 并禁用 ntpd -g 的大步调校。
使用场景:某些客户因合规要求必须对接指定 NTP 服务器,又不想放弃 CTSS 的集群内自适应同步能力。
-
/etc/ntp.conf中必须包含:tinker stepout 0和disable kernel - 启动参数要加
-x(平滑调整):修改/etc/sysconfig/ntpd中OPTIONS="-x" - 禁止使用
ntpdate手动强制校时——它会触发大步跳变,直接踢出 CTSS - 验证方式:
ntpq -p查看 offset 应长期维持在 ±5ms 内,且无 * 或 + 外的其他符号频繁闪动
跨网段或防火墙环境下的 NTP 连通性陷阱
RAC 节点若分布在不同子网,或中间有安全设备,默认 NTP 的 UDP 123 端口常被拦截。此时即使 ntpq -p 显示 server 在线,实际 offset 会缓慢累积,最终触发 CTSS 降级。
性能影响:单次 NTP 请求超时(默认 3 秒)会拖慢 CRS 启动过程;长期失联则使 observer 模式下的各节点各自漂移,RAC 可能拒绝启动新实例。
- 用
nc -uz <ntp-server> 123</ntp-server>测试 UDP 连通性(注意不是 telnet,UDP 不支持连接确认) - 若不通,在防火墙放行规则中明确写
udp dport 123,避免只开 TCP 或写错端口范围 - 不要依赖 DNS:NTP 配置里一律用 IP 地址,防止
/etc/resolv.conf不一致引发某节点解析失败 - 多 NTP 服务器配置时,至少保留一个本地局域网内的可靠源(如另一台 RAC 节点装 ntpd 并设为 stratum 5),避免全链路依赖外网
crsctl 时间相关诊断命令速查
排查时别反复翻文档,这几个命令组合起来能快速定位是 CTSS 问题、NTP 问题还是硬件时钟本身异常。
容易踩的坑:误以为 date 显示一致就代表时间同步正常——其实 CTSS 和 NTP 都可能在后台悄悄失效,而系统时间靠 drift 补偿暂时没露馅。
- 查 CTSS 实时状态:
crsctl check ctss(必须在每个节点单独跑) - 看 CTSS 日志细节:
tail -20 $GRID_HOME/log/`hostname`/ctssd/octssd.log - 查 NTP 偏移量(非 root 也可运行):
ntpdate -q <ntp-server></ntp-server>(注意不是 ntpq) - 比对所有节点硬件时间:
hwclock --show,若差异 >1 秒,说明 RTC 已偏移,需先hwclock --systohc同步一次
最麻烦的情况是 CTSS 和 NTP 都没报错,但 ocssd.bin 日志里反复出现 clsu_gettime: time diff too large——这时候得盯住 /var/log/messages 里 kernel 是否打了 time warp 或 clock was stepped,那是底层时钟被暴力修正的铁证。

















