最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何利用MySQL 8.0的持久化全局变量功能保存系统配置?
时间:2026-08-08 08:42:55 编辑:袖梨 来源:一聚教程网
SET PERSIST是MySQL 8.0+唯一能真正实现全局变量“改完重启不丢”的方式,它将配置写入数据目录下的mysqld-auto.cnf(JSON格式),而非my.cnf;仅支持VARIABLE_SCOPE='GLOBAL'且IS_DYNAMIC='YES'的变量(如max_connections、wait_timeout),datadir等只读变量不支持;需SYSTEM_VARIABLES_ADMIN权限,且数据目录必须可写。
SET PERSIST 是 MySQL 8.0+ 唯一能真正让全局变量“改完重启不丢”的方式,但它不是写进 my.cnf,而是写进 mysqld-auto.cnf —— 这个细节搞错,后续所有配置都会失效。
哪些变量能用 SET PERSIST 修改?先查再动
不是所有全局变量都支持持久化。直接执行会报错 ERROR 1238 (HY000): Variable 'xxx' is a read only variable。
- 必须同时满足:
VARIABLE_SCOPE = 'GLOBAL'且IS_DYNAMIC = 'YES' - 查法:运行
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—— 这些只能改my.cnf后重启
mysqld-auto.cnf 的位置、格式和编辑禁忌
它不在 /etc/my.cnf,也不在你挂载的配置目录里,而是固定落在 MySQL 数据目录下:
- 确认路径:
SELECT @@datadir;,然后进该目录检查是否存在mysqld-auto.cnf - 文件是 JSON 格式,含
"Timestamp"、"User"、"Host"等元信息 -
绝对不要用 vim / echo / sed 直接编辑它 —— 少一个逗号或引号,MySQL 启动就卡住,报错
Failed to load persisted variables或直接退出 - 已损坏时,优先用
RESET PERSIST variable_name清除条目;若全毁,临时加启动参数--persisted_globals_load=OFF绕过加载
SET PERSIST 和 SET PERSIST_ONLY 的行为差异
两者都写同一个 mysqld-auto.cnf,但对内存值的影响完全不同:
-
SET PERSIST max_connections = 500;→ 内存立刻变 500,且重启后仍是 500 -
SET PERSIST_ONLY log_bin = OFF;→mysqld-auto.cnf写入"log_bin": "OFF",但当前内存值不变,下次启动才生效 - 权限不同:
SET PERSIST需SYSTEM_VARIABLES_ADMIN;SET PERSIST_ONLY还要额外PERSIST_RO_VARIABLES_ADMIN,否则报错ERROR 1227 (42501) - 典型用途:
PERSIST_ONLY适合预设那些无法热改的变量(如innodb_log_file_size),避免配置漂移
验证是否真生效、误操作后怎么救
别只信 Query OK,得看两处:
- 查表:
SELECT * FROM performance_schema.persisted_variables WHERE VARIABLE_NAME = 'max_connections';—— 有记录才算落盘成功 - 查文件:进
@@datadir目录,cat mysqld-auto.cnf确认 JSON 结构合法(可用jq . mysqld-auto.cnf校验) -
RESET PERSIST max_connections不是回滚,是彻底移除该变量在mysqld-auto.cnf和performance_schema.persisted_variables中的条目 - 设为
DEFAULT(如SET PERSIST max_connections = DEFAULT;)也能清除持久化项,效果等同RESET PERSIST
真正容易被忽略的是:Docker 容器里 @@datadir 对应的宿主机目录必须可写,否则 SET PERSIST 会静默失败(报错 ERROR 3615 (HY000): Cannot write to mysqld-auto.cnf),而很多人只检查了 /etc/mysql 挂载权限。