服务器时间和时区错误引起的mysql数据统计出错

运营那边说,后台获取的数据,时间都不准确了,立马找到运维这边,程序那边也给我这边提供了一个线索,就是在mysql里面执行了

SELECT from_unixtime(1476883657);

显示的时间并不是北京时间。因为最近刚把mysql搬到了香港,需要都按照北京时间来设置服务器时间。

先看了下服务器的系统时间

date
Thu Oct 20 13:54:12 EDT 2016

时间确实不正确,设置下系统时间

date -s "2016-10-20 14:41:31"

写入cmos

clock -w

以为这就完事了,再到数据库里面查看一下,

>SELECT from_unixtime(1476883657);

显示的时间还是不对,

>select now();

查看数据库当前时间,也是不正确的,这是为啥了

后来定睛一看,原来时区有问题。那么要修改一下系统时区

cp  /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
cp: overwrite `/etc/localtime’? y

再在服务器上查看一下

date
Thu Oct 20 13:54:12 CST 2016

ok了,时区变成了CST了,而不是之前的EDT;现在服务器的系统时间和时区都对了,再到mysql里面查看一下当前时间和时间戳显示正确与否。

查看当前时间:

>select now(); 或者>select sysdate()
>SELECT from_unixtime(1476883657);

还是有问题,那么分析下来,应该就是mysql的时区问题了

>show variables like "%time_zone%";
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | EDT    |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set (0.00 sec)

#time_zone说明mysql使用system的时区,system_time_zone说明system使用EDT时区

果然mysql的时区没有改过来,表明mysql使用的是之前的系统时区,需要重启一下才能解决这个问题,当时线上业务怎么能轻易重启,那么就要使用临时的方法。

> set global time_zone = ‘+8:00‘;  ##修改mysql全局时区为北京时间,即我们所在的东8区
> set time_zone = ‘+8:00‘;  ##修改当前会话时区
> flush privileges;  #立即生效

好了,再来看看mysql的时区问题

>show variables like "%time_zone%";
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | EDT    |
| time_zone        | +08:00 |
+------------------+--------+
2 rows in set (0.00 sec)

再来试试时间戳,ok,因为数据库里面都是以时间戳来存储的,所以修改了mysql的时区和系统的时间、时区后顺利地解决了问题。

这里值得考虑的是,因为系统的时区修改了,时间也修改了,并且写入了CMOS,那么即使服务器重启,时间和时区也都是正确的,而mysql也需要重启才能读取到系统的最新时区,既然系统时区和时间都是正确的,那么mysql即使重启时区和时间也是正确的。这也是永久性做法。

时间: 2024-11-04 05:11:14

服务器时间和时区错误引起的mysql数据统计出错的相关文章

MySQL数据的主从复制、半同步复制和主主复制详解

一.MySQL复制概述 ⑴.MySQL数据的复制的基本介绍 目前MySQL数据库已经占去数据库市场上很大的份额,其一是由于MySQL数据的开源性和高性能,当然还有重要的一条就是免费~不过不知道还能免费多久,不容乐观的未来,但是我们还是要能熟练掌握MySQL数据的架构和安全备份等功能,毕竟现在它还算是开源界的老大吧! MySQL数据库支持同步复制.单向.异步复制,在复制的过程中一个服务器充当主服务,而一个或多个服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环

Django models通过DateTimeField保存到MySQL的时间的时区问题

最近开始使用Django开发一些系统,在models.py中设置一些数据库表结构并给日期时间字段赋初值,不过在使用的过程中,遇到一点问题.问题是,我本来服务器使用的市区是“Asia/Shanghai”(+08:00),然后用datetime.now保存到数据库中时,里面的时间总是比我的系统时间相差8小时(感觉是UTC时间),但是我也查看了MySQL数据库中的时区是“+08:00”的(在MySQL中“SET GLOBAL time_zone = ‘+08:00′;”语句可以设置时区).这到底是什么

关联mysql失败_Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezon' 时区错误

时区错误,MySQL默认的时区是UTC时区,比北京时间晚8个小时. 所以要修改mysql的时长 在mysql的命令模式下,输入: set global time_zone='+8:00'; 再次连接成功 关联mysql失败_Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezon' 时区错误 原文地址:https://www.cnblogs.com/wangjiaolong/p/12048066.ht

MySQL时区错误导致server time zone value 'Öйú±ê׼ʱ¼ä' 错误

时区错误 由于中国是东八区,跟mysql配置不同,需要修改: 管理员登录MySQL OK成功 MySQL时区错误导致server time zone value 'Öйú±ê׼ʱ¼ä' 错误 原文地址:https://www.cnblogs.com/XT-xutao/p/10591155.html

【时区】java项目new date()时间和服务器时间(数据库)不一致

造成这种问题的原因可能是:你的操作系统时区跟你JVM的时区不一致. 你的操作系统应该是中国的时区吧,而JVM的时区不一定是中国时区,你在应用服务器的Java虚拟机添加如下配置:  -Dfile.encoding=UTF8     -Duser.timezone=GMT+08 在一个精简的Linux安装上jre,发现所有的java程序获取的时间都不是系统时间.后来发现原来是时区不对.java程序获取的时间都是GMT时间,而系统是北京时间,应该是GMT+8,刚好相差8小时.网上搜了好多资料,只有两种

数据库学习----MySQL修改时区错误

MySQL修改时区错误 windows 打开显示隐藏文件夹 找到my.ini文件,一般是在C:\ProgramData\MySQL\MySQL Server 8.0路径下 找到文件中的[mysqld] 添加以下内容default-time-zone='+08:00' 重启服务 Linux 找到my.cnf文件,一般在/etc路径,或者/etc/mysql路径下 在mysqld 里面添加一下内容default-time-zone='+08:00' 重启mysql service mysql res

CentOS/Linux 自动同步服务器时间

新装的CentOS系统服务器可能设置了错误的时间,在做集群的时候时间是十分重要的,很有可能因为时间而导致集群发生故障,因此需要调整时区并调整时间.如下是CentOS系统使用NTP来从一个时间服务器同步时间,使时间定时同步一次. NTP:Network Time Protocol的简写,即网络时间协议,是用于互联网中时间同步的标准互联网协议.NTP的用途是把计算机的时间同步到某个时间标准.目前采用的时间标准是世界协调时UTC(Universal Time Coordinated). CentOS系

java Date时间的各种转换方式和Mysql存时间类型字段的分析

一:各种Date之间的转换方法 public class TimeTest { public static void main(String[] args) { Date date = new Date(); // 一.获取当前系统时间和日期并格式化输出: SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式 String dateTime = df.format(date); // For

sqoop导入数据时间日期类型错误

一个问题困扰了很久,用sqoop import从mysql数据库导入到HDFS中的时候一直报错,最后才发现是一个时间日期类型的非法值导致. hive只支持timestamp类型,而mysql中的日期类型是datetime, 当datetime的值为0000-00-00 00:00:00的时候,sqoop import成功,但是在hive中执行select语句查询该字段的时候报错. 解决方法是在创建hive表时用string字段类型. sqoop导入数据时间日期类型错误,布布扣,bubuko.co