前言

明天就是2015年了,新年快乐。

最近遇到一个Mysql的时区问题,由于之前环境都是运维搭建的,自己手动搭建也是用脚本安装的,没有做过多的了解,现在遇到一个问题,还是有一点点收获的,下面就让来讲一下的问题解决流程。

问题是UNIXT_TIMESTAMP()出来的时间有问题,知道是时区问题,但当时没有接触过任何Mysql时区方面的东西。解决流程如下

解决流程

查看Mysql中和时区相关的Variable

SHOW VARIABLES LIKE '%time_zone%'

结果:

system_time_zone  UTC
time_zone  SYSTEM

居然不是大东八区。sql语句的具体含义看变量名能猜出个大概意思,但还是看下Mysql官方手册怎么说:

http://dev.mysql.com/doc/refman/4.1/en/server-system-variables.html#sysvar_time_zone

The current time zone. This variable is used to initialize the time zone for each client that connects. By default, the initial value of this is 'SYSTEM' (which means, “use the value of system_time_zone”). The value can be specified explicitly at server startup with the --default-time-zone option. See Section 9.7, “MySQL Server Time Zone Support”. This variable was added in MySQL 4.1.3.

的翻译:

当前时区。这个参数用来初始化每一个客户端连接的时区。它的默认值是“SYSTEM”(意思是,使用system_time_zone的值作为时区)。这个值可以在msyql启动的时候用--default-time-zone指定。这个值在MYSQL4.1.3及以上版本可用。

http://dev.mysql.com/doc/refman/4.1/en/server-system-variables.html#sysvar_system_time_zone

The server system time zone. When the server begins executing, it inherits a time zone setting from the machine defaults.

的翻译:

服务器系统时区。当服务器启动时,他会读取系统的时区配置

那么上面的sql出来的结果的意思就是,当前Mysql使用的时区配置是操作系统时区配置,而操作系统时区配置是UTC。那么难道是Linux系统时区有问题?

查看Linux时区配置

date -R

结果:

Tue, 30 Dec 2014 12:12:39 +0800

Linux系统时区居然是正确的。那么只有一种可能,就是装好Linux和Mysql后,在时区设置有误的情况下启动了Mysql,导致Mysql读取了启动时的Linux时区配置。那现在问题就好办了。

重启Mysql

当然,线上环境重启需谨慎

service mysql restart

再执行

SHOW VARIABLES LIKE '%time_zone'

结果:

system_time_zone  CST
time_zone  SYSTEM

时区正常了!

结局

那么,是不是这个问题就解决了呢?接下来Hisune发现了一个大坑!由于某个表的字段使用了timestamp类型,发现重启Mysql后mysql会自动将timestamp字段的时间按修改的时区进行修改!!!

了个大去,Mysql把所有记录的时间全按新时区调整了!这回坑大了!只能截断表,重新导入数据完事。

这里也说一个问题,就是做任何操作前,一定要备份一下你的数据,以防万一!当然,这次实例中,你可以把时区再改回原来的,重启Mysql就数据还原了,但Hisune并不推荐这样做,万一修改时区影响到其他业务了呢?

题外话

修改linux时区

们可以这样修改Linux的时区配置:

cp /usr/share/zoneinfo/Asia/Hong_Kong /etc/localtime

关于Set time_zone

使用sql语句:

SET time_zone = '+8:00';

进行Mysql时区修改仅对当前Mysql连接有效,此方法极度不推荐。

关于my.conf

另一种不推荐的Mysql默认时区的修改方法:

my.conf,在mysqld中加入

default-time-zone='+8:00'

总结

总结就是,老老实实用Mysql的默认时区配置:读取系统时区配置吧!

如果您觉得您在我这里学到了新姿势,博主支持转载,姿势本身就是用来相互学习的。同时,本站文章如未注明均为 hisune 原创 请尊重劳动成果 转载请注明 转自: Mysql默认时区修改?关于Mysql时区的二三事 - hisune.com