MySQL与服务器时区问题实践总结

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL与服务器时区问题实践总结

常见的问题就是8小时问题,通常是由于时区设置错误导致的。

【1】Linux时区

① Centos6下

查看时区

[root@VM_0_12_centos ~]# cat /etc/sysconfig/clock
ZONE="Asia/Shanghai"
[root@VM_0_12_centos ~]# date -R
Tue, 12 Jan 2021 09:42:34 +0800
+0800表示东八区

设置时区

# 复制相应的时区文件,替换系统时区文件;或者创建链接文件
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#软连接设置
 ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

修改完Linux时区后,如果MySQL的时区应用的是time_zone=SYSTEM 。那么只有重启MySQL服务才能更新MySQL时区为Linux更新后的时区!


【2】MySQL时区

① 查看MySQL时区

show VARIABLES like '%time_zone%';
mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | CST    |
| time_zone        | SYSTEM |
+------------------+--------+

system_time_zone : 表示系统使用的时区是 CST

time_zone: 表示 MySQL 采用的是系统的时区。也就是说,如果在连接时没有设置时区信息,就会采用这个时区配置。


修改MySQL时区

#修改my.cnf文件 在[mysqld]添加如下配置  记得重启mysql服务
default-time-zone='+08:00'

② jdbc连接URL指定时区

修改jdbc连接设置,直接把连接的时区固定死,绕开mysql本身的时区。就是在jdbc连接配置上添加以下两个配置即可:

useTimezone=true&serverTimezone=GMT%2B8
#分别为启用时区设置和设置连接服务的时区。
或者:
serverTimezone=Asia/Shanghai



【3】CET,UTC,GMT,CST

① GMT

Greenwich Mean Time。 格林威治标准时间, 英国伦敦格林威治定为0°经线开始的地方,地球每15°经度 被分为一个时区,共分为24个时区,相邻时区相差一小时;例: 中国北京位于东八区,GMT时间比北京时间慢8小时。所以常见数据库URL上设置GMT+8


格林尼治标准时间(旧译格林尼治平均时间或格林威治标准时间)是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。

② UTC


Coordinated Universal Time。 世界协调时间,经严谨计算得到的时间,精确到秒,误差在0.9s以内, 是比GMT更为精确的世界时间。


协调世界时,又称世界标准时间或世界协调时间,简称UTC,从英文“Coordinated Universal Time”/法文“Temps Universel Cordonné”而来。台湾采用CNS 7648的《资料元及交换格式–资讯交换–日期及时间的表示法》(与ISO 8601类似)称之为世界统一时间。中国大陆采用ISO 8601-1988的国标《数据元和交换格式信息交换日期和时间表示法》(GB/T 7408)中称之为国际协调时间。协调世界时是以原子时秒长为基础,在时刻上尽量接近于世界时的一种时间计量系统。

③ DST

Daylight Saving Time。夏季节约时间,即夏令时。是为了利用夏天充足的光照而将时间调早一个小时,北美、欧洲的许多国家实行夏令时。



④ CST

Central Standard Time。北京时间,China Standard Time,又名中国标准时间,是中国的标准时间。在时区划分上,属东八区,比协调世界时早8小时,记为UTC+8,与中华民国国家标准时间(旧称“中原标准时间”)、香港时间和澳门时间和相同。当格林威治实践为凌晨0:00时,中国标准实践刚好为早上8:00。

Central Standard Time (USA) UT-6:00(美国cst时间:零区时减6个小时)
Central Standard Time (Australia) UT+9:30(澳大利亚cst:加9个半小时)
China Standard Time UT+8:00(中国cst:加8个小时)
Cuba Standard Time UT-4:00  (古巴cst:减4个小时) 
CST可以同时表示美国,澳大利亚,中国,古巴四个国家的标准时间

Asia/Shanghai是已地区命名的地区标准时,在中国叫CST,Linux不能显示设置为CST,可以是Asia/Shanghai。

⑤ CET

欧洲中部时间(英語:Central European Time,CET)是比世界标准时间(UTC)早一个小时的时区名称之一。它被大部分欧洲国家和部分北非国家采用。冬季时间为UTC+1,夏季欧洲夏令时为UTC+2。

【4】测试


① 设置Linux时区为PST(America/New_York)

如下设置后,Linux时区将会快8小时。

ln -sf /usr/share/zoneinfo/US/Pacific /etc/localtime
ls -l /etc/localtime
lrwxrwxrwx 1 root root 30 Jan 12 04:44 /etc/localtime -> /usr/share/zoneinfo/US/Pacific
date -R
Tue, 12 Jan 2021 05:11:17 -0800


② 查看此时MySQL时区

重启MySQL服务,查看时区:

mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | PST    |
| time_zone        | SYSTEM |
+------------------+--------+


那么此时项目部署在Linux上,进行插入操作,则插入时间会快8小时:



③ 设置MySQL时区

修改my.cnf,[mysqld]下添加配置:

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


然后重启MySQL服务。再次查看MySQL时区:

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


再次进行数据插入,此时时间正常:

④ 恢复MySQL时区采用系统时区,通过jdbc.url指定

spingboot项目中application.properties配置如下:

spring.datasource.url=jdbc:mysql://XXXX:3306/fruitmarket?useUnicode=true
&characterEncoding=utf8&serverTimezone=GMT%2B8&useTimezone=true

修改Linux时区为Asia/Shanghai :

[root@VM_0_12_centos classes]# date -R
Tue, 12 Jan 2021 06:26:10 -0800
[root@VM_0_12_centos classes]#  ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
[root@VM_0_12_centos classes]# date -R
Tue, 12 Jan 2021 22:27:52 +0800

useTimeZone


主要用在web服务器和数据库部署在不同时区时,转换二者交互中时间数据。


例如:web服务器部署在北京(GMT+8),数据库部署在美国加州(GMT-8)。现在web数据库有一条记录的创建时间是当地时区时间22:00,那存储到数据库的时间应该是数据库当地时区时间06:00。然后web服务器通过jdbc读取到这条记录后,读取到的创建时间应该仍旧是以当地时区为标准的22:00。


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
弹性计算 前端开发 JavaScript
高校学生在家实践ECS弹性云服务器
简单谈谈我这几周使用ECS弹性云服务器的体验感
|
1月前
|
弹性计算 前端开发 JavaScript
高校学生在家实践ECS弹性云服务器
简单谈谈我这几周使用ECS弹性云服务器的体验感
|
1月前
|
弹性计算 前端开发 JavaScript
高校学生在家实践ECS弹性云服务器
简单谈谈我这几周使用ECS弹性云服务器的体验感
|
23天前
|
弹性计算 前端开发 JavaScript
高校学生在家实践ECS弹性云服务器
简单谈谈我这几周使用ECS弹性云服务器的体验感
|
6天前
|
关系型数据库 MySQL Linux
Linux环境下MySQL数据库自动定时备份实践
数据库备份是确保数据安全的重要措施。在Linux环境下,实现MySQL数据库的自动定时备份可以通过多种方式完成。本文将介绍如何使用`cron`定时任务和`mysqldump`工具来实现MySQL数据库的每日自动备份。
19 3
|
5天前
|
存储 监控 关系型数据库
MySQL自增ID耗尽解决方案:应对策略与实践技巧
在MySQL数据库中,自增ID(AUTO_INCREMENT)是一种特殊的属性,用于自动为新插入的行生成唯一的标识符。然而,当自增ID达到其最大值时,会发生什么?又该如何解决?本文将探讨MySQL自增ID耗尽的问题,并提供一些实用的解决方案。
10 1
|
20天前
|
NoSQL 关系型数据库 MySQL
MySQL与Redis协同作战:百万级数据统计优化实践
【10月更文挑战第21天】 在处理大规模数据集时,传统的单体数据库解决方案往往力不从心。MySQL和Redis的组合提供了一种高效的解决方案,通过将数据库操作与高速缓存相结合,可以显著提升数据处理的性能。本文将分享一次实际的优化案例,探讨如何利用MySQL和Redis共同实现百万级数据统计的优化。
52 9
|
17天前
|
存储 弹性计算 NoSQL
"从入门到实践,全方位解析云服务器ECS的秘密——手把手教你轻松驾驭阿里云的强大计算力!"
【10月更文挑战第23天】云服务器ECS(Elastic Compute Service)是阿里云提供的基础云计算服务,允许用户在云端租用和管理虚拟服务器。ECS具有弹性伸缩、按需付费、简单易用等特点,适用于网站托管、数据库部署、大数据分析等多种场景。本文介绍ECS的基本概念、使用场景及快速上手指南。
57 3
|
21天前
|
弹性计算 前端开发 JavaScript
高校学生在家实践ECS弹性云服务器
简单谈谈我这几周使用ECS弹性云服务器的体验感
|
21天前
|
弹性计算 前端开发 JavaScript
高校学生在家实践ECS弹性云服务器
简单谈谈我这几周使用ECS弹性云服务器的体验感