线上系统时间慢八个小时的排查之路

 最近有一个新项目上线,在上线时,突然发现时间与正常时间对不上,少了八个小时;但我丝毫不慌,这不就是个时区的问题吗,简单,但是这一次它给我深深的上了一课,一起来看整个排查过程吧。

开始排查

排查数据库

一般的时区问题都是数据库配置或数据链接参数的配置问题,于是我立马就定位到了问题,应该是数据库的时区设置错了,于是我愉快的查看了数据库时区

命令: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) UT+9:30,澳大利亚

  • China Standard Time UT+8:00,中国

  • Cuba Standard Time UT-4:00,古巴

再次分析

很显然,这里与UTC时间无关,它只是时间标准。目前Mysql中的system_time_zone是CST,而CST可以代表4个不同的时区,那么,Mysql把它当做哪个时区进行处理了呢?

简单推算一下,中国时间是UT+8: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:修改数据库连接参数

## 原配置
serverTimezone=GMT%2B8
##修改 serverTimezone=Asia/Shanghai url: jdbc:mysql://localhost:3306/aurora_admin?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=Asia/Shanghai&autoReconnect=true&rewriteBatchedStatements=true&allowMultiQueries=true

到这里,我想着问题肯定已经解决了;愉快的测了一手;结果还是差八个小时?但是本地项目的时间是正常的啊,我开始有了不祥的预感; 于是我本地连上线上的数据库开始测试,发现时间是正常的。到这里,就基本排查出不是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 TZ=Asia/Shanghai

再次查看:

可以看到 TZ配置已经设置成功,到这里我似乎看到了希望;于是再次测试,然后我人傻了,时间依旧少八个小时;到这里,我实在是不知道还有什么是没排查的了,于是脑海里重新过一遍排查的过程。

1、本地连线上的数据库测试是正常的,所以数据库肯定是没问题的

2、项目程序也没问题:@JsonFormat()并没有指定其他时区,字段类型也对的上;

3、Linux时间也没问题,时区也设置了;

排查Docker

我突然想到项目是通过Docker 来构建的,难道是Docker内部的时区有问题,这是唯一还没有排查的地方了,于是查看Dockerfile配置文件!

很简单的配置呀,没理由出问题呀,为了保险起见;决定手动给他指定一个时区,最终的配置文件;添加配置:

# 安装tzdata(如果 设置时区不生效使用)
# RUN apk add --no-cache tzdata
# 设置时区
ENV TZ="Asia/Shanghai"

重新构建项目运行,再次测试,时间正常了。

总结

整个排查过程虽然艰辛,但好在是解决了,我们在排查问题的时候,一定要胆大心细,多个地方考虑,很小伙伴可能想到是数据库的问题,但是发现修改配置后依然不行,可能会想是不是数据库版本问题呀,或者是不是我们项目哪儿写的有问题呀,把代码,配置看了一遍又一遍,虽然有这个可能,但是我们的思想就局限到这个地方了,就不敢去想,或者不愿去相信会是服务器问题,或其他的问题;我们应该培养这种发散的思想。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/784065.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

交替子数组计数 - 力扣题解

⭐简单说两句⭐ ✨ 正在努力的小新~ 💖 超级爱分享,分享各种有趣干货! 👩‍💻 提供:模拟面试 | 简历诊断 | 独家简历模板 🌈 感谢关注,关注了你就是我的超级粉丝啦! &…

HarmonyOS实战开发-如何实现一个简单的健康生活应用(下)

获取成就 本节将介绍成就页面。 功能概述 成就页面展示用户可以获取的所有勋章,当用户满足一定的条件时,将点亮本页面对应的勋章,没有得到的成就勋章处于熄灭状态。共有六种勋章,当用户连续完成任务打卡3天、7天、30天、50天、…

MySQL中如何进行多表查询

目录 一、子查询 1.什么是子查询 2.注意事项 二、联结查询 1.什么是联结 2.内部联结(等值联结) ①WHERE语句 ②ON语句 3.自联结 4.自然联结 5.外部联结 三、组合查询 1.什么是组合查询 2.UNION规则 *本节涉及概念来源于图灵程序设计丛书&a…

GUN C/C++ (GCC/CLANG) 对于 __int128_t (128位有符号大整数的扩展支持平台限制)

鉴于我们对于GCC,在多个CPU目标平台上适用 __int128(GCC扩展)兼容的情况,目前 __int128 仅限在编译64位可执行程序平台被支持。 本文将列出目标CPU平台的支援情况: X86 不支持(i386、i686&#…

笔记: 数据结构与算法--时间复杂度二分查找数组

算法复杂度 不依赖于环境因素事前分析法 计算最坏情况的时间复杂度每一条语句的执行时间都按照t来计算 时间复杂度 大O表示法 n 数据量 ; f(n) 实际的执行条数当存在一个n0 , 使得 n > n0,并且 c * g(n) 恒> f(n) : 渐进上界(算法最坏的情况)那么f(n)的时间复杂度 …

【前端面试3+1】07vue2和vue3的区别、vue3响应原理及为什么使用proxy、vue的生命周期中在什么时期给接口发请求、【找出数组最大公约数】

一、vue2和vue3的区别 1.性能优化: Vue 3在性能方面有很大的提升,主要是通过虚拟DOM的优化和响应式系统的改进实现的。 虚拟 DOM 重构:Vue 3 中对虚拟 DOM 进行了重构,使得更新算法更加高效,减少了更新时的开销&#x…

14 - grace数据处理 - 泄露误差改正 - 空域滤波法(Mascon法)

@[TOC](grace数据处理 - 泄露误差改正 - 空域滤波法(Mascon法)) 空域法的基本思想是假设地面某区域的质量变化是由一系列位置已知、质量未知的质量块(小范围区域)引起的,那么将GRACE反演的结果归算到n个质量块上的过程就是泄露信号恢复的过程。个人理解是这样的:假定已知研…

gtsam::Pose3的compose()函数作用

#include <gtsam/geometry/Pose3.h> #include <iostream> int main(int argc, char** argv) {// B 的旋转量为绕 x 轴旋转 180 度gtsam::Pose3 B gtsam::Pose3(gtsam::Rot3(0, 1, 0, 0), gtsam::Point3(1, 2, 0));// A 的旋转量为绕 z 轴旋转 180 度gtsam::Pose3 A…

Linux零基础入门之华为欧拉系统安装

一、名词解释 Linux&#xff1f; Linux是一个开源的免费的操作系统&#xff0c;功能与windows一样。具有处理器管理&#xff0c;存储管理&#xff0c;设备管理&#xff0c;文件管理&#xff0c;作业管理等功能。 可以俗称为Linux操作系统&#xff0c;组织或个人&#xff0c;…

【FIFO】Standard / FWFT FIFO设计实现(一)——同步时钟

标准FIFO 本文使用位扩展的方式实现标准FIFO&#xff0c;原理可参考【AXIS】AXI-Stream FIFO设计实现&#xff08;一&#xff09;——基本模式&#xff0c;核心代码如下&#xff1a; logic [FIFO_DEPTH_WIDTH : 0] rd_ptr_r d0, wr_ptr_r d0;always_ff (posedge clk) beginif…

软考108-上午题-【结构化开发】-杂题+小结

一、杂题 真题1&#xff1a; 真题2&#xff1a; 真题3&#xff1a; 真题4&#xff1a; 数据流图到软件体系结构的映射 根据数据流的特点&#xff0c;可以将数据流图分为&#xff1a; 变换型数据流图事务型数据流图 其对应的映射分别为&#xff1a; 变换分析事物分析 一个…

网安学习笔记-day11,FTP服务器

FTP服务器 FTP介绍 FTP(File Transfer Protocol)文件传输协议 端口号&#xff1a;TCP 20/21 工作方式&#xff1a; 主动模式被动模式 服务器部署 准备阶段 配置IP windowsXP 192.168.1.21&#xff08;也可DHCP自动获取&#xff09; Windows2003 192.168.1.1 安装万维网…

ssm停车场管理系统

点赞收藏关注 → 私信领取本源代码、数据库 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于停车场管理系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了停…

146. 序列

题意&#xff1a; 有t个测试用例。 每个测试用例&#xff0c;包含m个数组&#xff0c;每个数组包含n个数字。你可以从每个数组里面选择一个数字&#xff0c;然后将m个数字加和得到一个数字。用这样的方式一共可以获得n的m次幂个数字。问&#xff0c;在这么多个数字中选出最小…

[leetcode]28. 找出字符串中第一个匹配项的下标

前言&#xff1a;力扣刷题 问题&#xff1a; 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 示例&…

全面对比API和SDK

目录 全面对比API和SDK1. 介绍2. API和SDK的基本概念3. API与SDK的区别4. API与SDK的优缺点对比5. API与SDK的使用场景6. API与SDK的开发和维护成本7. API与SDK的集成和实现方式8. API与SDK的安全性9. API与SDK的性能比较10. API与SDK的选择建议11. 总结 全面对比API和SDK 1. …

【Linux】进程管理:进程及概念精讲

前言&#xff1a;本节内容包含进程管理操作的各种基础概念精讲&#xff0c;同时部分板块包含Linux操作系统与一般操作系统的概念对比。不仅包含“书面概念”&#xff0c;还包含详细操作以及通俗讲解。 目录 一、进程概念引入 二、进程的描述与组织&#xff1a;进程控制块&…

nodejs的express编写http服务器配置跨域

配置跨域可引入cors包&#xff0c;插入到express的中间件中 1.引入cors包 npm install cors2. 使用cors 插入到中间件中 const app express()const corsOptions {origin: http://localhost:5173, // 允许访问的来源&#xff0c;可以是单个字符串或一个数组methods: [PUT],…

【python】《流畅的python》读书笔记之第1-2章

序 《流畅的python》是还在上学时就被安利的一本奇书&#xff0c;马克了很久一直没机会系统拜读。最近碰巧偶得第二版的pdf。经济周期的下行阶段正是用来学习充电的&#xff0c;于是乎打算捡起荒废许久的blog&#xff0c;读读书&#xff0c;写写字&#xff0c;蓄势待东风。 第…

xftp突然无法连接虚拟机

问题描述 使用xftp连接虚拟机的时候一直显示 连接xxx.xxx.xx.xx失败 问题原因查找 首先打开本地cmd命令提示符 ping 你的虚拟机ip地址 我的是 ping 192.168.xx.xx 显示请求超时 解决方案&#xff1a; 点击打开更改适配器选项 右键vmnet 8——属性 如图前四个选项必选 单…