必须用SET PERSIST而非SET GLOBAL,因后者仅内存生效、重启丢失;SET PERSIST会写入mysqld-auto.cnf并重启自动加载,且需SYSTEM_VARIABLES_ADMIN权限、变量须支持动态修改。

用 SET PERSIST 而不是 SET GLOBAL
直接执行 SET GLOBAL sort_buffer_size = 4194304 确实能立刻生效,但 MySQL 重启后会丢弃这个值,回退到配置文件或默认值。真正要“重启仍生效”,必须用 SET PERSIST——它会把变量写入数据目录下的 mysqld-auto.cnf 文件,并在下次启动时自动加载。
常见错误是以为 SET GLOBAL + 权限就够了,结果服务一重启就回到原样。注意:SET PERSIST 不仅改内存,还落盘;SET GLOBAL 只改内存。
-
SET PERSIST max_connections = 300→ 内存+持久化同时生效 -
SET PERSIST_ONLY max_connections = 300→ 只写入mysqld-auto.cnf,不改当前内存值(极少用) -
SET GLOBAL max_connections = 300→ 仅当前实例有效,重启即失效
确认变量是否支持动态修改
不是所有系统变量都能运行时改。比如 innodb_log_file_size 是静态变量,即使加 PERSIST 也会报错:ERROR 1238 (HY000): Variable 'innodb_log_file_size' is a read only variable。
判断方法:
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 查官方文档中该变量的 Dynamic 列是否为
Yes - 执行
SELECT VARIABLE_NAME, VARIABLE_SCOPE, SET_TIME FROM performance_schema.variables_info WHERE VARIABLE_NAME = 'sort_buffer_size',看VARIABLE_SCOPE是否含GLOBAL且可写 - 试设一次,看是否报错(最直接)
权限和用户变量别混淆
SET PERSIST 需要 SYSTEM_VARIABLES_ADMIN 权限(SUPER 在 8.0.16+ 已被弃用)。普通账号即使有 GRANT ALL 也不一定有这个权限,得显式授权:
GRANT SYSTEM_VARIABLES_ADMIN ON *.* TO 'admin'@'%';
另外注意别误写成用户变量:SET mycount = 1 会尝试找系统变量 mycount(不存在,报错);正确创建用户变量是 SET @mycount = 1,但这跟持久化完全无关。
持久化后怎么验证和清理
改完别只信 SHOW VARIABLES,那只是当前内存值。要确认是否真落盘:
- 查表:
SELECT * FROM performance_schema.persisted_variables(有记录才说明已持久化) - 看文件:
cat /var/lib/mysql/mysqld-auto.cnf(路径以SELECT @@datadir为准),内容是 JSON 格式,不可手动编辑 - 想撤销?用
RESET PERSIST max_connections,它会从mysqld-auto.cnf中删掉该项并重载
mysqld-auto.cnf 的优先级高于 my.cnf,但它是自动生成、自动加载的,出问题(如 JSON 损坏)会导致 mysqld 启动失败——这时候得删掉它或临时设 persisted_globals_load=OFF。

















