MySQL 8.0推荐使用SET PERSIST在线持久化全局变量,但须确保变量满足IS_DYNAMIC='YES'且VARIABLE_SCOPE='GLOBAL'、用户具备SYSTEM_VARIABLES_ADMIN权限、mysqld-auto.cnf所在目录可写;不支持的变量(如datadir、port)仍需修改my.cnf并重启。

直接说结论:用 SET PERSIST,别碰 my.cnf,但必须确认变量支持动态修改、权限够、mysqld-auto.cnf 可写。
哪些变量能用 SET PERSIST?先查再改,硬试必报错
不是所有全局变量都支持持久化。执行前必须验证两个条件:
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+)、sql_mode;
典型不可用的有:datadir、port、socket、server_id——这些仍得改 my.cnf + 重启。
硬写不支持的变量会直接报错:ERROR 1238 (HY000): Variable 'xxx' is a read only variable。
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
权限也不同:SET PERSIST 需要 SYSTEM_VARIABLES_ADMIN;SET PERSIST_ONLY 还额外需要 PERSIST_RO_VARIABLES_ADMIN。
典型误用场景:想关 binlog,但当前已有活跃事务依赖 binlog,就该用 PERSIST_ONLY 先落盘,等维护窗口重启生效。
执行失败的常见原因和检查项
报错基本不是语法问题,而是环境或权限卡住了:
-
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 启用、或目录属主不对(MySQL 容器内 uid 通常为 999) - 改完没生效?检查是否被
my.cnf里同名参数覆盖了 ——mysqld-auto.cnf优先级最高,但前提是它被成功加载;可通过SHOW VARIABLES LIKE 'persisted_globals_load';确认该开关是否为ON
别忽略加载时机:mysqld-auto.cnf 在启动时最后加载,但它是个 JSON 文件,格式极其脆弱;手动编辑一个逗号错,MySQL 就启动失败。
迁移后配置丢失?重点检查 mysqld-auto.cnf 是否随数据目录一起迁移
很多人以为只要把 /var/lib/mysql 挂载出去就万事大吉,但 mysqld-auto.cnf 就在 @@datadir 下(用 SELECT @@datadir; 确认),如果迁移时只拷贝了数据库文件而漏掉这个 JSON 文件,所有持久化设置就全丢了。
- 容器场景下,确保挂载点包含整个
datadir目录,不只是/var/lib/mysql子目录(有些镜像会把mysqld-auto.cnf放在同级) - Docker 启动时若加了
--persisted_globals_load=OFF或配置里设了persisted_globals_load = OFF,该文件会被跳过 - 误删或损坏后,不要手动重建 JSON,优先用
SET PERSIST重设变量,文件会自动重建
真正容易被忽略的是:哪怕你只是执行 SET PERSIST max_connections = 151;(而它当前就是 151),MySQL 依然会把它写进 mysqld-auto.cnf —— 这意味着迁移前必须确认该文件内容完整、结构合法,否则重启即失效。











