SET PERSIST 是 MySQL 8.0+ 解决配置重启丢失的核心语法,将变量持久化至数据目录下的 mysqld-auto.cnf(JSON 格式),启动时最后加载、优先级最高;仅支持 GLOBAL 级且动态可改的变量,如 max_connections、innodb_buffer_pool_size 等,而 datadir、port 等不可持久化。

SET PERSIST 是 MySQL 8.0+ 中真正解决“改完重启就丢”问题的核心语法。它不是简单地把值写进 my.cnf,而是自动写入数据目录下的 mysqld-auto.cnf(JSON 格式),且启动时最后加载、优先级最高——这意味着你不用再手动改配置文件、也不用担心路径错或拼写错。
哪些变量能用 SET PERSIST 修改
必须同时满足两个条件:
- 是全局(
GLOBAL)级别变量,不能是会话级(SESSION) - 支持动态修改(即
Variable_scope为Global或Both),可通过SHOW VARIABLES查看,或查information_schema.SYSTEM_VARIABLES表的VARIABLE_SCOPE字段 - 常见可持久化变量包括:
max_connections、innodb_buffer_pool_size、wait_timeout、log_bin(需配合其他条件)、sql_mode等 - 不可持久化的典型例子:
datadir、port、socket—— 这些只能靠启动参数或配置文件,SET PERSIST会直接报错ER_VAR_CANT_PERSIST
SET PERSIST 和 SET PERSIST_ONLY 的区别
关键在“是否立即生效”:
-
SET PERSIST max_connections = 500;:内存中立刻变成 500,同时写入mysqld-auto.cnf,重启后仍是 500 -
SET PERSIST_ONLY max_connections = 500;:只写入mysqld-auto.cnf,内存中值不变(比如还是 151),下次重启才生效 - 权限差异:
PERSIST需要SYSTEM_VARIABLES_ADMIN;PERSIST_ONLY还额外需要PERSIST_RO_VARIABLES_ADMIN - 典型使用场景:
PERSIST_ONLY适合修改那些当前无法动态变更的变量(如某些依赖已打开 binlog 的设置),先落盘,等下次重启时再生效
确认修改是否成功 & 查看持久化状态
别只信命令返回的 Query OK,得查两处:
- 查表:
SELECT * FROM performance_schema.persisted_variables WHERE VARIABLE_NAME = 'max_connections';—— 有记录说明已落盘 - 查文件:进入 MySQL 数据目录(用
SELECT @@datadir;确认),检查是否存在mysqld-auto.cnf,内容应为合法 JSON(不要手动编辑它) - 注意:
SET PERSIST即使设成和当前值一样的数,也会写入文件;但设为DEFAULT(如SET PERSIST max_connections = DEFAULT;)可清除该变量的持久化条目
误操作后怎么恢复
持久化不是“写死”,它可逆,但方式有限:
- 单个变量还原:
RESET PERSIST max_connections;—— 仅从mysqld-auto.cnf和performance_schema.persisted_variables中移除该条目,不影响当前运行值 - 清空全部持久化项:
RESET PERSIST;(无参数)—— 效果等同于删掉整个mysqld-auto.cnf文件 - 紧急兜底:
SET GLOBAL persisted_globals_load = OFF;(需重启生效),或直接删掉mysqld-auto.cnf后重启 MySQL(前提是没其他依赖它的初始化逻辑) - 重要提醒:
RESET PERSIST不会回滚当前内存中的值,只是删配置;如果想同步还原运行值,得再执行一次SET GLOBAL ... = DEFAULT或具体值
MySQL 8 的持久化机制本质是“配置覆盖层”,mysqld-auto.cnf 是最终生效层,但它藏在数据目录里、格式是 JSON、不建议手改——这些细节一旦忽略,就容易在排查启动失败时绕远路。











