专注东莞微信网站设计,seo排名优化表格工具,合肥城乡建设网站,生态农业网站模板最近有一个新项目上线#xff0c;在上线时#xff0c;突然发现时间与正常时间对不上#xff0c;少了八个小时#xff1b;但我丝毫不慌#xff0c;这不就是个时区的问题吗#xff0c;简单#xff0c;但是这一次它给我深深的上了一课#xff0c;一起来看整个排查过程吧。… 最近有一个新项目上线在上线时突然发现时间与正常时间对不上少了八个小时但我丝毫不慌这不就是个时区的问题吗简单但是这一次它给我深深的上了一课一起来看整个排查过程吧。
开始排查
排查数据库
一般的时区问题都是数据库配置或数据链接参数的配置问题于是我立马就定位到了问题应该是数据库的时区设置错了于是我愉快的查看了数据库时区
命令show variables like %time_zone%; 1、system_time_zone全局参数系统时区在MySQL启动时会检查当前系统的时区并根据系统时区设置全局参数system_time_zone的值。值为CST与系统时间的时区一致。
2、time_zone全局参数设置每个连接会话的时区默认为SYSTEM使用全局参数system_time_zone的值。
CST时间
CST时间中央标准时间。CST可以代表如下4个不同的时区 Central Standard Time (USA) UT-6:00美国 Central Standard Time (Australia) UT9:30澳大利亚 China Standard Time UT8:00中国 Cuba Standard Time UT-4:00古巴
再次分析
很显然这里与UTC时间无关它只是时间标准。目前Mysql中的system_time_zone是CST而CST可以代表4个不同的时区那么Mysql把它当做哪个时区进行处理了呢
简单推算一下中国时间是UT8:00美国是 UT-6:00当传入中国时间直接转换为美国时间未考虑时区问题时间便慢了14个小时。
解决方案
方案一修改数据库时区
既然是Mysql理解错了CST指定的时区那么就将其设置为正确的。
连接Mysql数据库设置正确的时区
set global time_zone 8:00;
set time_zone 8:00;
flush privileges;
再次执行show命令查看show variables like %time\_zone%;。
这里我选择方案2修改数据库连接参数
## 原配置
serverTimezoneGMT%2B8
##修改 serverTimezoneAsia/Shanghai url: jdbc:mysql://localhost:3306/aurora_admin?useUnicodetruecharacterEncodingutf8zeroDateTimeBehaviorconvertToNulluseSSLtrueserverTimezoneAsia/ShanghaiautoReconnecttruerewriteBatchedStatementstrueallowMultiQueriestrue
到这里我想着问题肯定已经解决了愉快的测了一手结果还是差八个小时但是本地项目的时间是正常的啊我开始有了不祥的预感; 于是我本地连上线上的数据库开始测试发现时间是正常的。到这里就基本排查出不是MySQL的问题。
排查 Linux
我开始怀疑是不是 linux 系统的时区有问题
查看硬件的时间hwclock --show 查看系统的时间date -R 发现Linux的时间是没问题的于是开始查服务器的时区配置 查看时区 TZ配置echo $TZ 发现为空于是查看系统配置查看系统配置命令env 发现确实没有 TZ 的配置系统并未设置TZ变量而是通过localtime指定时区于是我修改 localtime的指定。
先删除TZ环境变量unset TZ
再执行ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 命令etc目录下创建名称是localtime的快捷键指定到上海时区文件上
修改完成后果断重启项目测试结果令人失望时间依旧没有变化于是尝试直接加上 TZ配置
命令export TZAsia/Shanghai
再次查看 可以看到 TZ配置已经设置成功到这里我似乎看到了希望于是再次测试然后我人傻了时间依旧少八个小时到这里我实在是不知道还有什么是没排查的了于是脑海里重新过一遍排查的过程。
1、本地连线上的数据库测试是正常的所以数据库肯定是没问题的
2、项目程序也没问题JsonFormat(并没有指定其他时区字段类型也对的上
3、Linux时间也没问题时区也设置了
排查Docker
我突然想到项目是通过Docker 来构建的难道是Docker内部的时区有问题这是唯一还没有排查的地方了于是查看Dockerfile配置文件 很简单的配置呀没理由出问题呀为了保险起见决定手动给他指定一个时区最终的配置文件添加配置
# 安装tzdata(如果 设置时区不生效使用)
# RUN apk add --no-cache tzdata
# 设置时区
ENV TZAsia/Shanghai 重新构建项目运行再次测试时间正常了。
总结
整个排查过程虽然艰辛但好在是解决了我们在排查问题的时候一定要胆大心细多个地方考虑很小伙伴可能想到是数据库的问题但是发现修改配置后依然不行可能会想是不是数据库版本问题呀或者是不是我们项目哪儿写的有问题呀把代码配置看了一遍又一遍虽然有这个可能但是我们的思想就局限到这个地方了就不敢去想或者不愿去相信会是服务器问题或其他的问题我们应该培养这种发散的思想。