起因

近期一个项目报告,线上服务器时间不对,比正常时间相差了13个小时,同一个数据库不同的应用端写入时间不对。

一般程序相差N个小时的问题,应该说99.99%是时区问题引起的,紧接着我们需要检查各环境的时区配置,当前数据库是使用的阿里云RDS 5.7。

排查

校验服务器时间,结果无误,正常的东八区时间。

校验docker容器内部时间,结果无误,正常的东八区时间。

校验jvm虚拟机时间配置,结果无误,正常的东八区时间。

校验mysql服务器的时间配置,结果无误,是正确的,不过时区项显示的是:CST时区,突然明悟。

1a243b37be8a47b0c328781783870a0d.png

CST 时区

名为 CST 的时区是一个很混乱的时区,有四种含义:

美国中部时间 Central Standard Time (USA) UTC-06:00

澳大利亚中部时间 Central Standard Time (Australia) UTC+09:30

中国标准时 China Standard Time UTC+08:00

古巴标准时 Cuba Standard Time UTC-04:00

美国从“3月11日”至“11月7日”实行夏令时,美国中部时间改为 UTC-05:00,与 UTC+08:00 相差 13 小时。

为什么老的应用程序写入数据是没有问题的,而新应用有问题呢?差别就在于老系统中mysql驱动为老版本,而新系统采用了最新的mysq8.x驱动,新驱动与老驱动的处理方式的差异导致。

解决方法(其中一种即可)

直接将 mysql配置参数中的 system_time_zone修改为 +8:00,default-time-zone = '+08:00' 重启mysql生效。

在java程序mysql连接地址上添加参数 serverTimezone=Asia/Shanghai,重新发布程序即可,由于线上数据库不能轻易重启,我们采用滚动升级方式,无缝升级应用程序解决该问题。

版权声明:除特殊说明,文章均为博主 久酷 原创文章,转载请注明来源

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐