业务写入的时间比实际早八小时,页面展示又正常,导出报表时全对不上,改应用代码也没解决。

排查方向其实有限,先把可能性排一排。数据库会话时区是协调世界时,应用按本地时间写入;字段类型不带时区信息,按字面值存储;连接串里没有指定时区参数。

动手时先确认服务端和会话时区

mysql -e 'select @@global.time_zone,@@session.time_zone,now()'

随后看字段类型与存储值

mysql -e 'select id,create_time from 库名.表名 limit 3'

然后在连接串里指定时区

grep -rn 'serverTimezone' app/config/

等前面都确认过,再统一后校验写入结果

mysql -e 'select now(),@@session.time_zone'

白天有业务在跑,能验证的部分都压到了晚上做。

当时还开着另一个排查窗口,两边日志对照着看才定位到。

恢复的判定其实很直接。写入与展示时间一致,导出报表的时间与实际相符。

字段不带时区时,存进去的是字面值;要么全链路统一时区,要么用带时区的类型,混用一定出问题。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189