Mysql 数据库时间与系统时间不一致问题排查

一、产生问题

  • 在我们学习中使用到sysdate这个函数时,发现查出来的日期时间与当前的正确时间不一致,相差8个小时左右,为什么会产生这个问题?又该如何解决?

-- 在数据库中使用sysdate()函数查询系统时间
select sysdate();
  • 结果显示:

    图片.png

二、原因分析

  1. 原因分析1:第一时间想到的是数据库所在的云服务器时间可能与网络时间不同步,因为数据库是装在云服务器上的,但是这种可能性应该较小,因为购买的阿里云服务器应该不会存在这种问题,一般会自动校对时间。于是先确定云服务器的时间,输入date命令查看云服务器系统时间,结果云服务器显示的时间是正确的,如下图:

图片.png

  1. 原因分析2:排除第一种可能后,又想到Mysql是部署在云服务器的docker容器上的,会不会是docker容器时间不对呢?因此进入容器,查看容器的系统时间。
# 进入容器   d71f18f09a4e:容器id,以自己的容器id为准
docker exec -it d71f18f09a4e /bin/bash
# 查看系统时间
date

图片.png

  • 果然,容器的时间不对,跟正确的时间相差了8个小时,跟数据库查询的结果是一样的问题。所以SQL查出来的时间是跟随容器的系统时间一致的,因此存在同样的问题。所以我们只要把容器时间修改正确了,那我们通过SQL查询出来的时间不对的问题也就解决了。

三、解决方法

  1. 通过sql语句,查看系统时区,修改时区来校对时间
复制代码
-- 第一步:查看系统时区
show variables like '%time_zone%';

-- 第二步:修改时区,并生效
-- 修改系统时区
set global time_zone = '+08:00';
-- 修改当前会话时区
set time_zone = '+8:00';
-- 立马生效
flush privileges; 
-- 修改后再次查看
show variables like '%time_zone%';

-- 第三步:修改后再查看系统时间显示 
select sysdate(); 
复制代码
  • 第一步:系统时区查询:

图片.png

时区知识普及: 整个地球分为二十四时区,每个时区都有自己的本地时间。在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC, Universal Time Coordinated)。UTC与格林尼治平均时(GMT, Greenwich Mean Time)一样,都与英国伦敦的本地时相同。在本文中,UTC与GMT含义完全相同。 北京时区是东八区,领先UTC八个小时,所以我们的时区为UTC+8。

  • 第二步:修改时区,并生效:

图片.png

  • 第三步:修改后再查看系统时间:

图片.png

  1. 在云服务器上,把云服务器的正确时间文件拷贝到容器的中去,校对容器的时间
复制代码
# 将服务器上时间文件拷贝到容器  d71f18f09a4e:容器id,以自己的容器id为准
docker cp /usr/share/zoneinfo/Asia/Shanghai  d71f18f09a4e:/etc/localtime
# 重启容器
docker restart d71f18f09a4e
# 查看容器是否运行
docker ps
# 进入容器   d71f18f09a4e:容器id,以自己的容器id为准
docker exec -it d71f18f09a4e /bin/bash
# 查看容器的时间
date
复制代码
  • 第一步:复制日志文件后,查看容器时间:

图片.png

  • 第二步:数据库查询时间:

图片.png

注意:如果容器时间显示正确,但是数据库查询结果还是不对,则需要关闭客户端(navicat),重新打开后再次查询,基本就不会有问题了。

posted @   little小小  阅读(1653)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
点击右上角即可分享
微信分享提示