set persist能让支持动态修改的全局变量“改完就生效、重启也不丢”,但不写入my.cnf,而是自动存入datadir下的mysqld-auto.cnf;仅对variable_scope='global'且is_dynamic='yes'的变量生效,如max_connections、wait_timeout、innodb_buffer_pool_size(8.0.22+),而datadir、port等只读变量会报error 1238。

直接说结论:SET PERSIST 能让支持动态修改的全局变量“改完就生效、重启也不丢”,但它不写进 my.cnf,而是自动落盘到数据目录下的 mysqld-auto.cnf —— 这个路径和机制搞错,后续配置失效、启动失败、排查无从下手,基本是常态。
哪些变量能用 SET PERSIST 修改?
不是所有变量都行,必须同时满足两个硬条件:
-
VARIABLE_SCOPE = 'GLOBAL'(不能是SESSION级) -
IS_DYNAMIC = 'YES'(运行时可改,比如max_connections、wait_timeout、innodb_buffer_pool_size(8.0.22+))
查法很直接:
SELECT VARIABLE_NAME, VARIABLE_SCOPE, IS_DYNAMIC FROM performance_schema.variables_info WHERE VARIABLE_NAME = 'max_connections';
常见踩坑点:
-
datadir、port、socket这类只读变量,执行SET PERSIST会报错ERROR 1238 (HY000): Variable 'xxx' is a read only variable -
sql_mode可持久化,但值里含空格或逗号时,建议用引号包裹:SET PERSIST sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
SET PERSIST 和 SET PERSIST_ONLY 到底差在哪?
核心区别就一个:是否立刻改内存值。
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
-
SET PERSIST max_connections = 500;→ 内存立刻变成 500,同时写入mysqld-auto.cnf,下次重启还是 500 -
SET PERSIST_ONLY max_connections = 500;→ 只写文件,当前内存值不变(比如还是 151),等下次重启才加载生效
权限也不同:
-
SET PERSIST需要SYSTEM_VARIABLES_ADMIN -
SET PERSIST_ONLY还额外需要PERSIST_RO_VARIABLES_ADMIN,普通 DBA 通常没有这个权限,报错ERROR 1227 (42501)就是它
怎么确认修改真的落盘了?
别信 “Query OK”,得看两处:
- 查表:
SELECT * FROM performance_schema.persisted_variables WHERE VARIABLE_NAME = 'max_connections';—— 有记录才算成功落盘 - 查文件:先运行
SELECT @@datadir;拿到路径,再进该目录看mysqld-auto.cnf是否存在、内容是否为合法 JSON(可用jq . mysqld-auto.cnf快速校验)
注意:SET PERSIST max_connections = DEFAULT; 可清除该变量在 mysqld-auto.cnf 中的条目,相当于“撤销持久化”。
为什么不能手动编辑 mysqld-auto.cnf?
因为它是 MySQL 自动管理的 JSON 文件,格式极其敏感:
- 多一个逗号、少一个引号、时间戳字段错位 → 启动时直接报错
Failed to load persisted variables或卡死不动 - 文件被破坏后,MySQL 可能无法启动;临时解法是加启动参数
--persisted_globals_load=OFF跳过加载,或直接删掉该文件(丢失所有持久化配置) - 想删某一项?别用
vim或sed,用RESET PERSIST variable_name才安全
最常被忽略的一点:这个文件的加载优先级最高 —— 启动时最后读,会覆盖 my.cnf 里的同名配置。如果你在 my.cnf 和 mysqld-auto.cnf 里都设了 max_connections,最终生效的是后者,但你可能完全不知道它存在。










