能直接用SET PERSIST持久化需同时满足三条件:变量IS_DYNAMIC='YES'、VARIABLE_SCOPE='GLOBAL'、用户有SYSTEM_VARIABLES_ADMIN权限;查performance_schema.variables_info表确认,不满足则报ERROR 1238。

能直接用 SET PERSIST 持久化,但必须同时满足三个硬条件:变量支持动态修改、作用域是 GLOBAL、你有 SYSTEM_VARIABLES_ADMIN 权限——缺一不可,否则命令直接失败。
怎么确认某个变量能不能用 SET PERSIST?
别猜,查表最稳。MySQL 8.0 把所有变量的可持久化能力都暴露在 performance_schema.variables_info 里:
- 运行
SELECT VARIABLE_NAME, VARIABLE_SCOPE, IS_DYNAMIC FROM performance_schema.variables_info WHERE VARIABLE_NAME = 'max_connections'; - 必须看到
VARIABLE_SCOPE = 'GLOBAL'且IS_DYNAMIC = 'YES'才能用SET PERSIST - 常见支持的:
max_connections、wait_timeout、innodb_buffer_pool_size(8.0.22+)、sql_mode - 典型不支持的:
datadir、port、socket、server_id—— 这些改了会报ERROR 1238 (HY000): Variable 'xxx' is a read only variable
SET PERSIST 和 SET PERSIST_ONLY 到底怎么选?
核心就看你要不要「立刻生效」:
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
-
SET PERSIST max_connections = 5000;→ 内存值立刻变成 5000,同时写进mysqld-auto.cnf,重启后还是 5000 -
SET PERSIST_ONLY log_bin = OFF;→ 当前 binlog 不关,只把OFF写进文件,下次启动才生效(适合不能热关的参数) - 权限不同:
SET PERSIST_ONLY还要额外PERSIST_RO_VARIABLES_ADMIN,普通 DBA 通常没有 - 两者都写同一个文件:
mysqld-auto.cnf,位于SELECT @@datadir;返回的路径下,JSON 格式,自动管理
执行后为什么没生效?常见卡点在哪?
不是语法错,基本是环境或配置挡路:
- 权限不足 → 报错
ERROR 1227 (42000):给用户加权限:GRANT SYSTEM_VARIABLES_ADMIN ON *.* TO 'admin'@'%'; - 数据目录不可写 → 报错
ERROR 3615 (HY000):检查容器是否挂载为ro、SELinux 是否启用、mysqld-auto.cnf所在目录属主是否正确 - 被覆盖了 →
mysqld-auto.cnf加载优先级最高,但如果persisted_globals_load = OFF,它根本不会被读取;查一下:SHOW VARIABLES LIKE 'persisted_globals_load'; - 文件损坏 → 手动编辑过
mysqld-auto.cnf?JSON 少个逗号就导致 MySQL 启动失败。修复方法:RESET PERSIST variable_name或临时加--persisted_globals_load=OFF启动
最易被忽略的是 mysqld-auto.cnf 的加载时机和脆性:它在启动最后阶段加载,优先级最高,但格式容错率为零——哪怕多一个空格,MySQL 就起不来。

















