Mysql时间和本机时间不一致&Linux设置或修改时间与时区的正确方法

工作过程遇到开发告诉我数据库时间和当前时间不一致,于是去查看,发现系统时间不是当前时间,于是查找资料整理如下,希望也可以帮到其它人。

一、Mysql时间和本机时间不一致

通过mysql命令行模式下动态修改

1.查看mysql当前时间,当前时区

(root@localhost) [(none)]>select now();
+---------------------+
| now()               |
+---------------------+
| 2018-12-07 02:30:06 |
+---------------------+
1 row in set (0.00 sec)
(root@localhost) [(none)]> show variables like "%time_zone%";
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | EST    |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set (0.00 sec)
(root@localhost) [(none)]>

time_zone说明mysql使用system的时区
system_time_zone说明system使用EST时区

2、修改时区

临时生效

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

永久生效
通过修改my.cnf配置文件来修改时区

vim /etc/my.cnf ##在[mysqld]区域中加上
default-time_zone = '+8:00'
/etc/init.d/mysqld restart ##重启mysql使新时区生效

二、Linux设置或修改时间与时区的正确方法

首先了解一下linux系统的时间

linux系统时间有两个,一个是硬件时间,即BIOS时间,就是我们进行CMOS设置时看到的时间,另一个是系统时间,是linux系统Kernel时间。当Linux启动时,系统Kernel会去读取硬件时钟的设置,然后系统时钟就会独立于硬件运作。有时我们会发现系统时钟和硬件时钟不一致,因此需要执行时间同步。

1)查看时间和设置时间以及系统时钟和硬件时钟同步

1、date 查看/设置系统时间
1、将日期设置为2018年10月6日
[root@linux ~]# date -s 10/06/18
2、将时间设置为11点12分13秒
[root@linux ~]# date -s 11:12:13
3、将时间设置为2018年10月6日11点12分13秒(MMDDhhmmYYYY.ss)
[root@linux ~]# date 1006111218.13
2、hwclock/clock 查看/设置硬件时间
1、查看系统硬件时钟(以下两个一样效果)
[root@linux ~]# hwclock  --show
[root@linux ~]# clock  --show
2、设置硬件时间(以下两个一样效果)
[root@linux ~]# hwclock --set --date="10/06/18 12:13" (月/日/年时:分:秒)
[root@linux ~]# clock --set --date="10/06/18 12:13" (月/日/年时:分:秒)
3、同步系统及硬件时钟
1、系统时间找硬件时间同步(以下两个一样效果)
[root@linux ~]# hwclock --hctosys
[root@linux ~]# clock --hctosys  
备注:hc代表硬件时间,sys代表系统时间,以硬件时间为基准,系统时间找硬件时间同步
2、硬件时间找系统时间同步(以下两个一样效果)
[root@linux ~]# hwclock --systohc
[root@linux ~]# clock --systohc 
备注:以系统时间为基准,硬件时间找系统时间同步

2)修改时区

首先了解时区

CentOS和Ubuntu的时区文件是/etc/localtime,但是在CentOS7以后localtime以及变成了一个链接文件

[root@centos7 ~]# ll /etc/localtime 
lrwxrwxrwx 1 root root 33 Oct 15  2017 /etc/localtime -> /usr/share/zoneinfo/Asia/Shanghai

如果采用直接cp的方法修改系统时区,那么就会把它所链接的文件修改掉,例如把美国的时区文件内容修改成了上海的时区内容,有可能会导致有些编程语言或程序在读取系统时区的时候发生错误

正确的修改时区方法

1、CentOS6、Ubuntu16

# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

2、CentOS7、RHEL7等等

最好的方法是使用timedatectl命令
# timedatectl list-timezones |grep Shanghai    #查找中国时区的完整名称
# timedatectl set-timezone Asia/Shanghai    #其他时区以此类推

或者直接手动创建软链接
# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

3、修改配置文件来修改时区

[root@linux ~]# echo "ZONE=Asia/Shanghai" >> /etc/sysconfig/clock         
[root@linux ~]# rm -f /etc/localtime
#链接到上海时区文件       
[root@linux ~]# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

总结:

我的场景是mysql数据库时间和当前时间不一致,是系统时区问题。后来发现这个系统时区是EST美国时区,是客户提供的系统,部署系统时没有选对时区。现在数据库又不能停止,因此按照上面,这数据库全局设置set global time_zone = '+8:00';然后数据库时间是正常的了(说明: system_time_zone 这个值是数据库启动从系统读取产生的只读变量,不可修改)。然后就是我的系统是centos7.4,因此使用timedatectl 命令修改系统时区是最方便的,这样即使数据库重启或系统重启,都是正确的时区。

[root@linux ~]# timedatectl set-timezone Asia/Shanghai
[root@linux ~]# timedatectl status
      Local time: Fri 2018-12-07 11:11:39 CST
  Universal time: Fri 2018-12-07 03:11:39 UTC
      RTC time: Fri 2018-12-07 11:11:37
      Time zone: Asia/Shanghai (CST, +0800)
      NTP enabled: yes
      NTP synchronized: yes
      RTC in local TZ: yes
      DST active: n/a
 [root@linux ~]#

推荐阅读更多精彩内容