set persist可同时实现参数立即生效与重启持久化,需满足变量is_dynamic='yes'且variable_scope='global'、用户具备system_variables_admin权限、数据目录对mysqld-auto.cnf可写。

它能真正解决“改完重启就丢”这个高频运维痛点——只要变量支持动态修改、你有权限、数据目录可写,一条命令就能同时让配置立即生效 + 重启不丢失,不用碰 my.cnf,也不用担心容器重启后参数回退。
哪些变量能用 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 = 'max_connections'; - 常见支持的:
max_connections、wait_timeout、innodb_buffer_pool_size(8.0.22+)、log_bin(需配合SET PERSIST_ONLY) - 典型不支持的:
datadir、port、socket、server_id——这些仍得改my.cnf+ 重启
SET PERSIST 和 SET PERSIST_ONLY 的关键区别在哪?
核心就一个:是否立刻改内存值。
-
SET PERSIST max_connections = 5000;→ 内存立即变 5000,同时写入mysqld-auto.cnf,重启后还是 5000 -
SET PERSIST_ONLY log_bin = OFF;→ 内存值不变(比如当前 binlog 还开着),只写进mysqld-auto.cnf,下次重启才关闭 binlog - 两者都写同一个文件:
mysqld-auto.cnf(位于数据目录下,JSON 格式),千万别手动编辑它 - 权限差异:
SET PERSIST需要SYSTEM_VARIABLES_ADMIN;SET PERSIST_ONLY还额外需要PERSIST_RO_VARIABLES_ADMIN
执行失败的常见原因和对应检查项
报错基本不是语法问题,而是环境或权限卡住了。
-
ERROR 1227 (42000): Access denied; you need SYSTEM_VARIABLES_ADMIN privilege→ 普通 root 默认没这个权限,要显式授权:GRANT SYSTEM_VARIABLES_ADMIN ON *.* TO 'admin'@'%'; -
ERROR 3615 (HY000): Cannot write to mysqld-auto.cnf→ 数据目录不可写(常见于容器挂载为ro、SELinux 启用、或目录属主不对) - 改完没生效?检查是否被
my.cnf里同名参数覆盖了(mysqld-auto.cnf优先级更高,但前提是它被成功加载;可通过SHOW VARIABLES LIKE 'persisted_globals_load';确认该开关是否为ON)
最易被忽略的是 mysqld-auto.cnf 的加载时机和破坏风险:它在启动时最后加载、优先级最高,但 JSON 格式极其脆弱——错一个逗号,MySQL 就可能启动失败。不要用 vim 直接编辑,也不要 echo 覆盖。真出问题,优先用 RESET PERSIST variable_name 或临时加 --persisted_globals_load=OFF 启动。











