MySQL 启动后发现 SELECT NOW()
时间不对怎么办
安装完 MySQL 默认时区通常是
SYSTEM,也就是继承操作系统的时区设置。但很多 Linux 发行版默认是 UTC,而你的应用需要东八区(
Asia/Shanghai),直接查
NOW()就会差 8 小时。
别急着改系统时区——MySQL 有独立的时区控制链:启动参数 → 配置文件 → 会话变量。优先级从高到低,且部分设置重启才生效。
mysqld启动时加
--default-time-zone='+08:00'或
--default-time-zone='Asia/Shanghai',但需确保系统已加载 tzdata(Ubuntu/Debian 要装
tzdata包,CentOS 装
glibc-common) 更稳妥的方式是写进配置文件:
/etc/my.cnf或
/etc/mysql/my.cnf的
[mysqld]段下加一行:
default-time-zone = '+08:00'(推荐用偏移量,避免依赖系统时区数据库) 改完必须重启
mysqld;验证方式:
SELECT @@global.time_zone, @@session.time_zone;,两个都应显示
+08:00注意:即使全局设了,客户端连接仍可能被驱动或连接字符串覆盖(比如 JDBC 的
serverTimezone=GMT%2B8参数不能少)
哪些 my.cnf
参数对新部署实例最关键
刚装好的 MySQL 默认配置面向低负载测试环境,生产用必须调。不改可能很快遇到连接超限、查询慢、写入卡顿等问题。
max_connections:默认 151,小项目够用;中等业务建议 500–1000,但得配合 OS 层
ulimit -n调高(否则 MySQL 启动报错
Can't create thread)
innodb_buffer_pool_size:InnoDB 缓存核心,物理内存的 50%–75% 是安全范围;设太大反而触发频繁 swap,观察
Innodb_buffer_pool_wait_free状态变量是否持续 > 0
innodb_log_file_size:默认 48MB 太小,高写入场景建议 256–1024MB;但修改需停库、删旧日志、重启,不能热改
wait_timeout和
interactive_timeout:默认 28800 秒(8 小时),长连接池未正确 close 会导致连接堆积;建议调成 300–600 秒,由应用层保活
为什么改了 my.cnf
却没生效
MySQL 加载配置的路径和顺序容易踩坑,尤其是多版本共存或用包管理器安装的实例。
运行mysqld --verbose --help | grep "Default options"查真实读取路径(常见有
/etc/my.cnf、
/etc/mysql/my.cnf、
~/.my.cnf、
$MYSQL_HOME/my.cnf) 确认你编辑的是
[mysqld]段下的配置,不是
[client]或
[mysql];后者只影响命令行工具,不影响服务端行为 检查语法:注释必须用
#或
;,不能用
//;布尔值写
ON/OFF或
1/0,不要写
true/false改完配置后,用
mysqld --defaults-file=/etc/my.cnf --validate-config验证语法(MySQL 5.7.20+ 支持);无效配置会导致启动失败且日志里只报“unknown variable”之类模糊提示
时区和参数调优后还要注意什么
最常被忽略的是权限与持久化细节:比如
default-time-zone设为
Asia/Shanghai后,如果系统
/usr/share/zoneinfo/Asia/Shanghai文件被删或权限不对,MySQL 启动时不会报错,但实际按 UTC 运行;又比如
innodb_buffer_pool_size调大后没同步调高
vm.swappiness,内存压力大会导致性能断崖式下跌。
上线前务必跑一次
SHOW VARIABLES LIKE '%time%';和
SHOW STATUS LIKE 'Innodb_buffer_pool%';,对照预期值核对。
