同步程序把源库的 datetime 当本地时间读,写目标库时又按 UTC 存了一次。同一条记录在目标表里出现两个时间点,正好隔 8 小时。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,源库连接没设 serverTimezone,驱动按 JVM 默认时区解释。目标端写入时按 UTC 再转一次,同一个时刻被写成两个值。按时间范围做增量拉取时,这两个值都会被当成新数据。

「同步时区错位」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

SELECT id, create_time,
       CONVERT_TZ(create_time,'+08:00','+00:00') utc_time
FROM dst_order LIMIT 10;

权限不要一口气开到最大,先加到够用再往上试,范围小才好收。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。

具体做法是,连接串显式写 serverTimezone=Asia/Shanghai 两端保持一致;增量水位统一用 UTC 存 展示时再转;把 datetime 改成 timestamp 让库自己处理时区;清洗存量数据 把偏移 8 小时的那批合并。

最后用这个标准收尾,同一业务单号在目标表只剩一条 时间点和源库一致。

作者 9823189