MySQL 8.0 推荐使用 SET PERSIST 在线持久化动态全局变量,需满足 IS_DYNAMIC='YES' 且 VARIABLE_SCOPE='GLOBAL',并具备 SYSTEM_VARIABLES_ADMIN 权限;SET PERSIST 立即生效并写入 mysqld-auto.cnf,而 SET PERSIST_ONLY 仅写入文件、重启后生效。

MySQL 8.0 中,直接改 my.cnf 再重启不是最安全、最可控的方式;用 SET PERSIST 才是推荐的在线持久化手段——但前提是参数可动态修改,且你有 SYSTEM_VARIABLES_ADMIN 权限。
哪些变量能用 SET PERSIST?先查再改
不是所有全局变量都支持持久化。执行前必须确认:IS_DYNAMIC = 'YES' 且 VARIABLE_SCOPE = 'GLOBAL'。
- 查单个变量:运行
SELECT VARIABLE_NAME, VARIABLE_SCOPE, IS_DYNAMIC FROM performance_schema.variables_info WHERE VARIABLE_NAME = 'max_connections'; - 常见支持的:
max_connections、wait_timeout、innodb_buffer_pool_size(8.0.22+)、sort_buffer_size - 典型不支持的:
datadir、port、socket、log_bin(需配合SET PERSIST_ONLY)、protocol_version(只读) - 报错
ERROR 1238 (HY000): Variable 'xxx' is a read only variable就说明不能用SET PERSIST
SET PERSIST 和 SET PERSIST_ONLY 的关键区别
核心差异在于「是否立即生效」:
-
SET PERSIST max_connections = 5000;→ 当前立即生效 + 写入mysqld-auto.cnf→ 重启后仍为 5000 -
SET PERSIST_ONLY log_bin = OFF;→ 只写入mysqld-auto.cnf,当前值不变 → 下次重启才生效(适合 binlog 类敏感变更) - 两者都写进数据目录下的
mysqld-auto.cnf,该文件由 MySQL 自动管理,绝对不要手动编辑 - 启动时加载优先级:命令行参数 >
mysqld-auto.cnf>my.cnf,所以mysqld-auto.cnf会覆盖my.cnf里的同名配置
权限和路径问题最容易导致失败
看似一条命令,实际卡在权限或文件系统上的情况极多:
- 普通
root用户默认没有SYSTEM_VARIABLES_ADMIN权限,需显式授权:GRANT SYSTEM_VARIABLES_ADMIN ON *.* TO 'admin'@'%'; - 报错
ERROR 1227 (42000)多半是权限不足;报错ERROR 3615 (HY000)是mysqld-auto.cnf所在目录不可写(比如容器里挂载为只读) - 验证是否落盘:查
performance_schema.persisted_variables表,或直接cat /var/lib/mysql/mysqld-auto.cnf(路径以实际数据目录为准) - 误操作后想清理:可用
RESET PERSIST max_connections;清空该变量在mysqld-auto.cnf和表中的记录(不影响当前运行值)
真正容易被忽略的是:即使 SET PERSIST 成功,如果 mysqld-auto.cnf 文件损坏或 JSON 格式错误,MySQL 启动时可能直接失败。生产环境务必确保该文件所在目录可写、可读,且禁止人工干预其内容。


















