set persist需同时满足变量支持动态修改、用户具备system_variables_admin权限、mysqld-auto.cnf所在目录可写,三者缺一不可;否则命令看似成功但重启失效。

直接改 my.cnf 并重启,是最稳妥、兼容所有 MySQL 版本的方式;MySQL 8.0+ 可用 SET PERSIST,但必须确认变量支持、权限到位、mysqld-auto.cnf 可写——否则命令看似成功,重启后照样失效。
确认 MySQL 实际加载哪个配置文件
MySQL 启动时按固定顺序查找配置文件,只读第一个存在的。盲目修改 /etc/my.cnf 却发现没生效,大概率是它根本没被加载。
- 运行
mysql --help | grep "Default options",看输出顺序,例如:Default options are read from the following files in the given order: /etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf - 检查哪个文件真实存在且非空:
ls -l /etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf 2>/dev/null - 确保你要改的文件在列表中靠前,且内容里有
[mysqld]段落(不是[client]或裸露参数)
在 my.cnf 中正确添加全局变量
写错段落、单位、引号或语法,会导致 MySQL 启动失败或静默忽略配置。
- 所有服务端变量必须放在
[mysqld]段落下,例如:[mysqld] max_connections = 500 wait_timeout = 28800 innodb_buffer_pool_size = 2G
- 单位必须大写:
sort_buffer_size = 2M(小写m会被当作文本忽略) -
sql_mode必须加单引号:sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' - 改前务必备份:
sudo cp /etc/mysql/my.cnf /etc/mysql/my.cnf.bak-$(date +%Y%m%d)
MySQL 8.0+ 使用 SET PERSIST 的硬性前提
SET PERSIST 不是万能开关,三个条件缺一不可,任一失败都会导致“命令执行成功但重启无效”。
- 变量本身必须支持动态修改:查
SELECT VARIABLE_NAME, IS_DYNAMIC, VARIABLE_SCOPE FROM performance_schema.variables_info WHERE VARIABLE_NAME = 'max_connections';,需同时满足IS_DYNAMIC = 'YES'且VARIABLE_SCOPE = 'GLOBAL' - 用户需有
SYSTEM_VARIABLES_ADMIN权限(普通root默认没有):GRANT SYSTEM_VARIABLES_ADMIN ON *.* TO 'admin'@'%'; -
mysqld-auto.cnf所在目录(即SELECT @@datadir;返回路径)必须可写,且persisted_globals_load = ON(查SHOW VARIABLES LIKE 'persisted_globals_load';) - 执行后验证是否落盘:
SELECT * FROM performance_schema.persisted_variables WHERE VARIABLE_NAME = 'max_connections';
为什么改了还是不生效?重点排查这三处
配置没生效,90% 的问题不在语法,而在加载链路或权限边界被忽略。
-
mysqld-auto.cnf优先级最高,但它一旦 JSON 格式损坏(比如手动编辑多了一个逗号),MySQL 启动会卡住或报Failed to load persisted variables—— 别手改它,出问题用RESET PERSIST variable_name或临时加--persisted_globals_load=OFF启动 - 如果
my.cnf和mysqld-auto.cnf同时定义了同一变量,后者胜出;但若persisted_globals_load = OFF,则完全不加载后者 - 容器环境常见陷阱:挂载的
datadir是只读的、SELinux 阻止写入、MySQL 进程 UID(如 999)对目录无写权限











