MySQL time_zone=SYSTEM时CURRENT_TIME与服务器时间不符问题排查
解决MySQL CURRENT_TIME与服务器时间不一致的问题
这种情况我之前排查过好几次,虽然time_zone = SYSTEM理论上会让MySQL直接沿用系统时区,但实际还有几个容易被忽略的配置和细节需要确认:
1. 确保MySQL进程能正确读取系统时区环境变量
有时候MySQL启动时没有继承系统的TZ环境变量,导致即使系统时区正确,MySQL也无法识别。
- 先检查系统时区:
# Linux系统 timedatectl # 或者查看时区标识 date +%Z - 确认MySQL进程的环境变量:可以通过
ps aux | grep mysqld查看启动参数,或者在MySQL配置文件(my.cnf/my.ini)的[mysqld]段添加:
添加后重启MySQL服务,确保配置生效。default-time-zone = SYSTEM
2. 检查并修复MySQL时区表
MySQL的SYSTEM时区依赖于系统的时区数据,但如果mysql库下的时区表缺失或不完整,会导致时区解析错误。
- 先查看时区表是否有数据:
如果返回0,说明时区表是空的,需要重新导入:USE mysql; SELECT COUNT(*) FROM time_zone_name;
导入完成后重启MySQL,再检查时区表数据是否正常。# 适用于Linux系统,将系统时区数据导入MySQL mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
3. 排查会话级别的时区设置
全局time_zone是SYSTEM不代表所有会话都继承这个设置,可能某个会话被手动修改过时区:
- 检查当前会话的时区:
SELECT @@session.time_zone; - 如果结果不是
SYSTEM,可以手动重置:
同时要确认你的应用程序在连接数据库时,没有通过代码设置会话时区(比如某些ORM框架会默认设置时区)。SET SESSION time_zone = 'SYSTEM';
4. 验证系统时钟的一致性
确保服务器的系统时钟和硬件时钟(RTC)同步,避免时间漂移:
- 查看硬件时钟:
hwclock --show - 对比系统时钟(
date命令输出),如果不一致,执行同步:hwclock --systohc - 同时确认NTP服务(比如
chronyd或ntpd)处于运行状态,保证系统时间长期准确:systemctl status chronyd
最后验证
完成以上步骤后,重启MySQL服务,然后执行以下命令确认:
SHOW GLOBAL VARIABLES LIKE 'time_zone'; SELECT CURRENT_TIME(), NOW();
此时CURRENT_TIME的输出应该和服务器date命令的时间完全一致。
内容的提问来源于stack exchange,提问作者Adriano Castro
相关产品推荐
相关产品推荐

