蓝易云cdn:Mysql时间同步设置
MySQL 的“时间同步”,本质不是在 MySQL 里点个开关就完事,而是要把 操作系统时间(NTP/Chrony)+ 时区策略 + MySQL 时区配置 三件事统一口径。否则你会遇到:日志时间乱跳、订单时间漂移、主从延迟判断失真、审计对不上账——服务器甚至能“活在昨天”。🙂
一、目标与原则(先定标准)

- 所有数据库节点系统时间必须准(靠 Chrony/NTP 自动校时)。
- 全链路时区必须一致(建议全公司统一:要么全 UTC,要么全业务时区)。
- MySQL 必须显式设置 time_zone,不要靠默认猜测。
企业级建议:
- 存储统一用 UTC(跨地域、跨系统最省治理成本)✅
- 展示给用户时再做时区转换(应用层/报表层)📊
二、第一层:CentOS 系统时间同步(Chrony 推荐)⏱️
1)确认时间状态
timedatectl
chronyc tracking
chronyc sources -v
2)启用 Chrony 并设置开机自启
systemctl enable --now chronyd
systemctl status chronyd
3)(可选)配置企业内部 NTP 源
编辑:
vi /etc/chrony.conf
常见做法:写入你可信的 NTP 源(内网优先),保存后:
systemctl restart chronyd
chronyc sources -v
关键点:确保服务器能访问 UDP 123,否则你配置得再漂亮也同步不上。🔍
三、第二层:系统时区统一(别让节点各唱各的调)🌍
查看当前时区:
timedatectl
设置时区(示例二选一,集群必须统一):
timedatectl set-timezone UTC
# 或
timedatectl set-timezone Asia/Shanghai
#(若你业务口径是台北时间,可用 Asia/Taipei,同理)
四、第三层:MySQL 时区同步与落地(最容易被忽略)🧠
1)检查 MySQL 当前时间与时区
SELECT NOW(), UTC_TIMESTAMP(),
@@global.time_zone, @@session.time_zone, @@system_time_zone;
2)加载时区表(否则你设置 “Asia/Shanghai” 可能会报错)
在系统侧执行(需有权限):
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -uroot -p mysql
验证时区表是否生效(MySQL):
SELECT COUNT(*) FROM mysql.time_zone_name;
3)设置 MySQL 默认时区(推荐写死,避免漂移)
方案 A:统一 UTC(推荐)
- 配置文件(/etc/my.cnf 或 /etc/mysql/my.cnf)加入:
[mysqld]
default_time_zone = '+00:00'
重启:
systemctl restart mysqld
方案 B:统一业务时区(需要已加载时区表)
[mysqld]
default_time_zone = 'Asia/Shanghai'
让当前会话立即生效(不等重连):
SET time_zone = '+00:00';
-- 或
SET time_zone = 'Asia/Shanghai';
五、一个容易踩坑的点:TIMESTAMP vs DATETIME(时间“看起来同步”,其实存法不同)⚠️
| 类型 | 存储方式 | 是否受时区影响 | 典型用途 |
|---|---|---|---|
| TIMESTAMP | 以 UTC 存,读写时转换 | 是 | 事件时间、日志时间(推荐统一 UTC) |
| DATETIME | 原样存字符串含义 | 否 | 需要“原始录入时间”且不转换的字段 |
一句话:你想要“全局一致”,优先考虑 UTC + TIMESTAMP/统一转换策略。✅
六、上线自检清单(照着勾就行)✅
-
chronyd正常运行且 sources 有有效上游 - 所有 DB 节点
timedatectl显示同一时区策略 - MySQL:
@@global.time_zone明确为+00:00或业务时区 - 已导入时区表(
mysql.time_zone_name非空) - 应用侧展示时区与数据库策略一致(别双重转换)🙂
如果你告诉我:你要统一 UTC 还是统一 业务时区,以及 MySQL 版本(5.7/8.0/Percona/MariaDB)和是否有主从,我可以把最稳的配置模板(含验证 SQL 与回滚方案)直接给你。