业务写入的时间比实际早八小时,页面展示又正常,导出报表时全对不上,改应用代码也没解决。
排查方向其实有限,先把可能性排一排。数据库会话时区是协调世界时,应用按本地时间写入;字段类型不带时区信息,按字面值存储;连接串里没有指定时区参数。
动手时先确认服务端和会话时区
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'
白天有业务在跑,能验证的部分都压到了晚上做。
当时还开着另一个排查窗口,两边日志对照着看才定位到。
恢复的判定其实很直接。写入与展示时间一致,导出报表的时间与实际相符。
字段不带时区时,存进去的是字面值;要么全链路统一时区,要么用带时区的类型,混用一定出问题。这类问题最好一次改到位,反复小改反而容易把原因搅混。