my.cnf 文件位置不固定,先确认实际生效路径
MySQL 启动时按固定顺序查找
my.cnf,不同安装方式(包管理器安装、二进制解压、Homebrew、Docker)导致路径差异极大。硬写死
/etc/my.cnf或
/usr/my.cnf很可能无效。 运行
mysql --help | grep "Default options",输出中带
my.cnf的路径才是 MySQL 实际读取的搜索列表 更可靠的方式是连接 MySQL 后执行
SELECT @@global.config_file;(8.0.26+)或
SHOW VARIABLES LIKE 'config_file';,但该变量仅在配置文件确实被加载时才非空 macOS Homebrew 安装默认用
~/homebrew/etc/my.cnf;Ubuntu apt 安装通常为
/etc/mysql/my.cnf,且会
!include子目录下的
conf.d/*.cnf
修改前必须停掉 mysqld,否则配置不生效
MySQL 不支持热重载
my.cnf—— 即使执行
mysqladmin reload或
SERVICE mysql reload,也只重载部分运行时变量(如权限表),不会重新解析全局配置项(如
innodb_buffer_pool_size、
max_connections)。 务必先执行
sudo systemctl stop mysql(systemd)或
sudo service mysql stop(SysV),确认进程已退出:
ps aux | grep mysqld修改后启动失败常见于语法错误:多一个逗号、漏写括号、用了中文标点、section 名写错(如写成
[mysqld_safe]却没对应程序)。启动失败时看错误日志:
sudo tail -n 50 /var/log/mysql/error.log或
sudo journalctl -u mysql -n 50若不确定改得是否正确,可临时用
mysqld --defaults-file=/path/to/my.cnf --validate-config验证语法(5.7.21+ 支持)
关键配置项要放在正确 section 下,避免被忽略
my.cnf是分段式 INI 文件,每个配置项必须位于对应 program section 内,否则会被跳过。最常见错误是把
innodb_log_file_size写在
[client]下,或把
default-character-set(已废弃)写在
[mysqld]中。
[mysqld]:所有服务端参数,包括存储引擎、缓冲区、网络绑定等 ——
bind_address、
innodb_buffer_pool_size、
log_error必须在此节
[client]:影响所有客户端工具(
mysql、
mysqldump),如
default-character-set=utf8mb4(注意:MySQL 8.0+ 默认 utf8mb4,此行可省)
[mysql]:仅影响
mysql命令行客户端,如
pager less -S、
auto-rehash不要在
[mysqld]里写
user=root——这会让 mysqld 以 root 启动,存在严重安全风险;应使用系统级 service 文件或
mysql_install_db初始化时指定用户
[mysqld] port = 3306 bind_address = 127.0.0.1 innodb_buffer_pool_size = 2G max_connections = 200 log_error = /var/log/mysql/error.log [client] default-character-set = utf8mb4 [mysql] pager = less -S
字符集与排序规则需两端一致,否则出现乱码或索引失效
只改
my.cnf不足以保证 UTF-8 正常工作。MySQL 的字符集有四层:server → database → table → column,且 client 连接时还受
character_set_client、
collation_connection影响。 推荐在
[mysqld]中统一设为:
character-set-server = utf8mb4和
collation-server = utf8mb4_unicode_ci(MySQL 8.0+ 推荐
utf8mb4_0900_as_cs) 创建数据库时显式指定:
CREATE DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;应用连接字符串中必须包含
charset=utf8mb4(如 Python PyMySQL 的
charset='utf8mb4',Java JDBC 的
useUnicode=true&characterEncoding=utf8mb4) 检查当前连接实际生效值:
SHOW VARIABLES LIKE 'character\_set%'; SHOW VARIABLES LIKE 'collation%';配置生效与否,最终取决于 MySQL 启动时是否真正加载了你编辑的文件,并且没有被更高优先级路径中的同名配置覆盖。最稳妥的做法是:停服务 → 查找真实配置路径 → 编辑对应文件 → 验证语法 → 启动 → 检查变量值。任何一步跳过,都可能导致“明明改了却没用”。
