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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 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。


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3月前
|
弹性计算 前端开发 JavaScript
高校学生在家实践ECS弹性云服务器
简单谈谈我这几周使用ECS弹性云服务器的体验感
|
6天前
|
人工智能 监控 测试技术
阿里云磐久服务器稳定性实践之路
阿里云服务器质量智能管理体系聚焦自研服务器硬件层面的极致优化,应对高并发交付、短稳定性周期、早问题发现和快修复四大挑战。通过“三个重构”(质量标准、开发流程、交付模式)、“六个归一”(架构、硬件、软件、测试、部件、制造)策略,实现芯片、整机和云同步发布,确保快速稳定上量。此外,全场景测试体系与智能预警、分析、修复系统协同工作,保障服务器在萌芽阶段发现问题并及时解决,提升整体质量水平。未来,阿里云将继续深化大数据驱动的质量管理,推动服务器行业硬件质量的持续进步。
|
8天前
|
存储 人工智能 运维
面向AI的服务器计算软硬件架构实践和创新
阿里云在新一代通用计算服务器设计中,针对处理器核心数迅速增长(2024年超100核)、超多核心带来的业务和硬件挑战、网络IO与CPU性能增速不匹配、服务器物理机型复杂等问题,推出了磐久F系列通用计算服务器。该系列服务器采用单路设计减少爆炸半径,优化散热支持600瓦TDP,并实现CIPU节点比例灵活配比及部件模块化可插拔设计,提升运维效率和客户响应速度。此外,还介绍了面向AI的服务器架构挑战与软硬件结合创新,包括内存墙问题、板级工程能力挑战以及AI Infra 2.0服务器的开放架构特点。最后,探讨了大模型高效推理中的显存优化和量化压缩技术,旨在降低部署成本并提高系统效率。
|
16天前
|
SQL 存储 关系型数据库
MySQL/SqlServer跨服务器增删改查(CRUD)的一种方法
通过上述方法,MySQL和SQL Server均能够实现跨服务器的增删改查操作。MySQL通过联邦存储引擎提供了直接的跨服务器表访问,而SQL Server通过链接服务器和分布式查询实现了灵活的跨服务器数据操作。这些技术为分布式数据库管理提供了强大的支持,能够满足复杂的数据操作需求。
58 12
|
26天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化与慢查询优化:原理与实践
通过本文的介绍,希望您能够深入理解MySQL索引优化与慢查询优化的原理和实践方法,并在实际项目中灵活运用这些技术,提升数据库的整体性能。
71 5
|
1月前
|
存储 关系型数据库 MySQL
PHP与MySQL动态网站开发:从基础到实践####
本文将深入探讨PHP与MySQL的结合使用,展示如何构建一个动态网站。通过一系列实例和代码片段,我们将逐步了解数据库连接、数据操作、用户输入处理及安全防护等关键技术点。无论您是初学者还是有经验的开发者,都能从中获益匪浅。 ####
|
2月前
|
关系型数据库 MySQL Java
MySQL索引优化与Java应用实践
【11月更文挑战第25天】在大数据量和高并发的业务场景下,MySQL数据库的索引优化是提升查询性能的关键。本文将深入探讨MySQL索引的多种类型、优化策略及其在Java应用中的实践,通过历史背景、业务场景、底层原理的介绍,并结合Java示例代码,帮助Java架构师更好地理解并应用这些技术。
62 2
|
2月前
|
关系型数据库 MySQL Linux
Linux环境下MySQL数据库自动定时备份实践
数据库备份是确保数据安全的重要措施。在Linux环境下,实现MySQL数据库的自动定时备份可以通过多种方式完成。本文将介绍如何使用`cron`定时任务和`mysqldump`工具来实现MySQL数据库的每日自动备份。
161 3
|
2月前
|
存储 监控 关系型数据库
MySQL自增ID耗尽解决方案:应对策略与实践技巧
在MySQL数据库中,自增ID(AUTO_INCREMENT)是一种特殊的属性,用于自动为新插入的行生成唯一的标识符。然而,当自增ID达到其最大值时,会发生什么?又该如何解决?本文将探讨MySQL自增ID耗尽的问题,并提供一些实用的解决方案。
64 1
|
1月前
|
SQL 关系型数据库 MySQL
PHP与MySQL的高效交互:从基础到实践####
本文深入探讨了PHP与MySQL数据库之间的高效交互技术,涵盖了从基础连接到高级查询优化的全过程。不同于传统的摘要概述,这里我们直接以一段精简代码示例作为引子,展示如何在PHP中实现与MySQL的快速连接与简单查询,随后文章将围绕这一核心,逐步展开详细讲解,旨在为读者提供一个从入门到精通的实战指南。 ```php <?php // 数据库配置信息 $servername = "localhost"; $username = "root"; $password = "password"; $dbname = "test_db"; // 创建连接 $conn = new mysqli($se
33 0