MySQL 8.0+支持SET PERSIST的参数需满足IS_DYNAMIC='YES'且VARIABLE_SCOPE='GLOBAL',如max_connections、wait_timeout、innodb_buffer_pool_size(8.0.22+),而datadir、port等只读参数不支持;SET PERSIST立即生效并写入mysqld-auto.cnf,SET PERSIST_ONLY仅写入文件、重启后生效,两者均需SYSTEM_VARIABLES_ADMIN权限且依赖目录可写。

MySQL 8.0+ 的动态参数修改,只要用 SET PERSIST 就能既立即生效又重启不丢——前提是参数支持动态修改且用户有 SYSTEM_VARIABLES_ADMIN 权限。
哪些参数能用 SET PERSIST?
不是所有变量都支持。只有标为 Dynamic 的全局变量才允许 SET PERSIST;否则会报错 ERROR 1238 (HY000): Variable 'xxx' is a read only variable。
- 查是否可持久化:运行
SELECT VARIABLE_NAME, VARIABLE_SCOPE, IS_DYNAMIC FROM performance_schema.variables_info WHERE VARIABLE_NAME = 'max_connections';,确认IS_DYNAMIC = 'YES'且VARIABLE_SCOPE = 'GLOBAL' - 常见支持的:
max_connections、wait_timeout、innodb_buffer_pool_size(MySQL 8.0.22+)、log_bin(需配合SET PERSIST_ONLY) - 不支持的典型例子:
datadir、port、socket—— 这些必须改配置文件 + 重启
SET PERSIST 和 SET PERSIST_ONLY 的区别
关键在「是否立刻应用」:
-
SET PERSIST max_connections = 5000;→ 立即生效 + 写入mysqld-auto.cnf→ 重启后仍为 5000 -
SET PERSIST_ONLY max_connections = 5000;→ 只写入mysqld-auto.cnf,当前值不变 → 下次重启才生效(适合不能热改的参数,比如binlog_format在某些场景下) - 两者都会把配置写进数据目录下的
mysqld-auto.cnf文件,该文件由 MySQL 自动管理,**不要手动编辑它**
执行 SET PERSIST 后要注意什么?
看似简单,但几个细节容易翻车:
- 权限不足会报错
ERROR 1227 (42000): Access denied; you need (at least one of) the SYSTEM_VARIABLES_ADMIN privilege(s) for this operation—— 普通root用户默认没有这个权限,需显式授权:GRANT SYSTEM_VARIABLES_ADMIN ON *.* TO 'admin'@'%'; - 如果
mysqld-auto.cnf所在目录不可写(比如容器里挂载为只读),SET PERSIST会失败并报错ERROR 3615 (HY000): Cannot write to mysqld-auto.cnf - 当
my.cnf和mysqld-auto.cnf同时存在冲突配置时,MySQL 启动时按「配置文件加载顺序」合并:命令行参数 >mysqld-auto.cnf>my.cnf(后者会被前者覆盖) - 执行后可验证是否落盘:
SELECT * FROM performance_schema.persisted_variables;—— 这张表只显示已持久化的变量,不包含临时SET GLOBAL的值
为什么有时 SET PERSIST 生效了,重启后却没变?
最常被忽略的是「配置文件优先级干扰」:
- 检查是否在
my.cnf中显式写了同名参数(比如[mysqld] max_connections = 1000),它会覆盖mysqld-auto.cnf里的值 - 确认
mysqld-auto.cnf确实存在且内容正确:cat /var/lib/mysql/mysqld-auto.cnf(Linux)或type "C:\ProgramData\MySQL\MySQL Server 8.0\mysqld-auto.cnf"(Windows) - 如果 MySQL 启动时加了
--defaults-file参数,它会跳过默认路径的所有配置文件,包括mysqld-auto.cnf - 容器环境要特别注意:若挂载了空目录或未映射
/var/lib/mysql,mysqld-auto.cnf无法落盘,每次重启都是新实例
真正可靠的持久化,不是靠记住“改完要重启”,而是让 MySQL 自己管住配置——SET PERSIST 是手段,理解它和配置文件的共存关系才是关键。尤其在自动化部署中,别让 my.cnf 里的静态值悄悄覆盖掉你精心设置的运行时策略。











