在 Oracle 集群中(多台机器合作为一个数据库提供服务)“sysdate”函数是否总是返回一致的答案?即使服务器的操作系统时钟报告的值不一致?
4 回答
SYSDATE 与节点操作系统相关;如果在整个集群中保证正确,那么每次调用 SYSDATE 时节点都必须同步。在集群环境中,有序序列很昂贵;如果可能,最好避免。有序序列将保证您的唯一性和顺序 - 但是,如果在从序列中选择之后和提交事务之前处理失败,您仍然可能会出现间隙。
我们使用了一些解决方法:
- 通常,将序列设置为无序且具有大缓存大小 (25,000) 以减少集群间通信。
- 使用 NTP 对节点进行时间同步(它们仍然可能不正确,+/- 纳秒,所以你不能依赖这个)
- 对于审计风格的日志,我们使用 systimestamp (timestamp(6)) 作为唯一标识符 - 并且接受这样一个事实,即日志可能出现乱序(尽管极不可能)(这在正常处理中也是可能的,取决于提交发生的时间)
在需要有序序列并且可能存在间隙的地方 - 使用有序序列(尽量避免在集群环境中,因为“缓存”无济于事)
在需要有序序列的地方——但不能有间隙——我们有自己的序列表,锁定记录,获取数字,然后保持记录锁定直到用户提交;这将导致其他试图获得相同序列的其他人等到用户的事务完全提交 - 尽可能避免这样做。
使用 NTP 在所有服务器(Oracle 和其他服务器)之间同步时间,并确保不会发生这种情况。不一致的系统时钟是灾难的根源。
我猜想sysdate 在您描述的场景中会返回不一致的结果。
我强烈怀疑 SYSDATE 也与操作系统相关。非常注意您需要使用它的原因。如果有任何实现事件增量跟踪的逻辑(例如,您正在执行增量导出)并且您必须确保没有遗漏任何项目以及没有重复,则基于顺序 ID 而不是 SYSDATE 进行跟踪。
事实上,即使对于非集群系统也是如此,因为 SYSDATE 有时会发生变化(节省时间、系统管理员错误......)。
我花了(一点点)时间寻找答案,但找不到答案,但是,鉴于 sysdate 只是从操作系统返回日期/时间,我怀疑 dmitriy 是正确的。