起因
近期一个项目报告,线上服务器时间不对,比正常时间相差了13个小时,同一个数据库不同的应用端写入时间不对。
一般程序相差N个小时的问题,应该说99.99%是时区问题引起的,紧接着我们需要检查各环境的时区配置,当前数据库是使用的阿里云RDS 5.7。
排查
校验服务器时间,结果无误,正常的东八区时间。
校验docker容器内部时间,结果无误,正常的东八区时间。
校验jvm虚拟机时间配置,结果无误,正常的东八区时间。
校验mysql服务器的时间配置,结果无误,是正确的,不过时区项显示的是:CST时区,突然明悟。
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,重新发布程序即可,由于线上数据库不能轻易重启,我们采用滚动升级方式,无缝升级应用程序解决该问题。
版权声明:除特殊说明,文章均为博主 久酷 原创文章,转载请注明来源