set persist仅支持is_dynamic='yes'且variable_scope='global'的变量(如max_connections、wait_timeout),不支持datadir等只读变量;需system_variables_admin权限,写入mysqld-auto.cnf并立即生效,重启不丢失。

SET PERSIST 不能用于“恢复参数”,它只写入新值,不撤销或回滚已有配置。 想把某个变量改回旧值,必须明确用 SET PERSIST 赋一个具体数值,而不是“恢复”——MySQL 没有内置的 undo 或 revert 机制。
哪些变量能用 SET PERSIST 修改?先查再设
不是所有变量都支持持久化。硬写会直接报错 ERROR 1238 (HY000): Variable 'xxx' is a read only variable。
- 必须同时满足:
IS_DYNAMIC = 'YES'且VARIABLE_SCOPE = 'GLOBAL' - 查法:运行
SELECT VARIABLE_NAME, VARIABLE_SCOPE, IS_DYNAMIC FROM performance_schema.variables_info WHERE VARIABLE_NAME = 'wait_timeout'; - 常见可持久化的调优参数:
max_connections、wait_timeout、innodb_buffer_pool_size(8.0.22+)、innodb_stats_persistent - 典型不可用的:
datadir、port、socket、server_id——这些仍得改my.cnf+ 重启
SET PERSIST 和 SET PERSIST_ONLY 的行为差异很关键
两者都写入同一文件 mysqld-auto.cnf,但对当前内存值的影响完全不同:
-
SET PERSIST wait_timeout = 300;→ 内存立即变为 300,且下次启动仍为 300 -
SET PERSIST_ONLY log_bin = OFF;→ 当前 binlog 仍开着,只写进文件,重启后才关闭 - 权限不同:
SET PERSIST需SYSTEM_VARIABLES_ADMIN;SET PERSIST_ONLY还要额外PERSIST_RO_VARIABLES_ADMIN - 别指望
SET PERSIST_ONLY“先存着等恢复”——它只是延迟生效,不是备份或快照
执行后没生效?重点排查这三处
成功返回 Query OK 不代表已落盘或已加载。
- 权限不足 → 报错
ERROR 1227 (42000):普通root默认无SYSTEM_VARIABLES_ADMIN,需显式授权:GRANT SYSTEM_VARIABLES_ADMIN ON *.* TO 'admin'@'%'; - 目录不可写 → 报错
ERROR 3615 (HY000): Cannot write to mysqld-auto.cnf:容器挂载为只读、SELinux 启用、或datadir所在目录属主不是mysql用户 - 文件未被加载 →
SHOW VARIABLES LIKE 'persisted_globals_load';返回OFF,或mysqld-auto.cnfJSON 格式损坏导致 MySQL 启动时静默跳过
验证是否真正落盘?别只信命令返回
确认写入成功,优先查表而非看文件:
- 执行
SELECT * FROM performance_schema.persisted_variables;—— 这是唯一可靠的方式,直接反映 MySQL 实际加载的持久化变量 - 手动检查
mysqld-auto.cnf很危险:它是 JSON 格式,错一个逗号就可能导致 MySQL 启动失败 - 该文件位置固定:
$(mysql -Nse "SELECT @@datadir;")/mysqld-auto.cnf,不要编辑、重定向覆盖、或用 vim 直接删某一行
最易被忽略的是:即使你用 SET PERSIST 成功写了值,如果 mysqld-auto.cnf 在启动时因格式错误被跳过,或者 persisted_globals_load 被关掉,那它就完全不起作用——而这种失效不会报错,只会静默退回到 my.cnf 或默认值。











