一聚教程网:一个值得你收藏的教程网站

热门教程

如何利用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

  1. 必须同时满足:VARIABLE_SCOPE = 'GLOBAL'IS_DYNAMIC = 'YES'
  2. 查法:运行 SELECT VARIABLE_NAME, VARIABLE_SCOPE, IS_DYNAMIC FROM performance_schema.variables_info WHERE VARIABLE_NAME = 'max_connections';
  3. 常见可持久化变量:max_connectionswait_timeoutinnodb_buffer_pool_size(8.0.22+)、sql_mode
  4. 典型不可持久化变量:datadirportsocket —— 这些只能改 my.cnf 后重启

mysqld-auto.cnf 的位置、格式和编辑禁忌

它不在 /etc/my.cnf,也不在你挂载的配置目录里,而是固定落在 MySQL 数据目录下:

  1. 确认路径:SELECT @@datadir;,然后进该目录检查是否存在 mysqld-auto.cnf
  2. 文件是 JSON 格式,含 "Timestamp""User""Host" 等元信息
  3. 绝对不要用 vim / echo / sed 直接编辑它 —— 少一个逗号或引号,MySQL 启动就卡住,报错 Failed to load persisted variables 或直接退出
  4. 已损坏时,优先用 RESET PERSIST variable_name 清除条目;若全毁,临时加启动参数 --persisted_globals_load=OFF 绕过加载

SET PERSIST 和 SET PERSIST_ONLY 的行为差异

两者都写同一个 mysqld-auto.cnf,但对内存值的影响完全不同:

  1. SET PERSIST max_connections = 500; → 内存立刻变 500,且重启后仍是 500
  2. SET PERSIST_ONLY log_bin = OFF;mysqld-auto.cnf 写入 "log_bin": "OFF",但当前内存值不变,下次启动才生效
  3. 权限不同:SET PERSISTSYSTEM_VARIABLES_ADMINSET PERSIST_ONLY 还要额外 PERSIST_RO_VARIABLES_ADMIN,否则报错 ERROR 1227 (42501)
  4. 典型用途:PERSIST_ONLY 适合预设那些无法热改的变量(如 innodb_log_file_size),避免配置漂移

验证是否真生效、误操作后怎么救

别只信 Query OK,得看两处:

  1. 查表:SELECT * FROM performance_schema.persisted_variables WHERE VARIABLE_NAME = 'max_connections'; —— 有记录才算落盘成功
  2. 查文件:进 @@datadir 目录,cat mysqld-auto.cnf 确认 JSON 结构合法(可用 jq . mysqld-auto.cnf 校验)
  3. RESET PERSIST max_connections 不是回滚,是彻底移除该变量在 mysqld-auto.cnfperformance_schema.persisted_variables 中的条目
  4. 设为 DEFAULT(如 SET PERSIST max_connections = DEFAULT;)也能清除持久化项,效果等同 RESET PERSIST

真正容易被忽略的是:Docker 容器里 @@datadir 对应的宿主机目录必须可写,否则 SET PERSIST 会静默失败(报错 ERROR 3615 (HY000): Cannot write to mysqld-auto.cnf),而很多人只检查了 /etc/mysql 挂载权限。

热门栏目