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

最新下载

热门教程

如何利用MySQL 8.0的Persist功能实现在线修改参数永久生效?

时间:2026-09-03 19:40:49 编辑:袖梨 来源:一聚教程网

只有同时满足IS_DYNAMIC='YES'且VARIABLE_SCOPE='GLOBAL'的全局变量(如max_connections、wait_timeout、innodb_buffer_pool_size等)才支持SET PERSIST;datadir、port等只读变量不支持,须改my.cnf后重启。

哪些变量能用 SET PERSIST 修改?先查再试

不是所有全局变量都支持持久化。硬写会直接报错:ERROR 1238 (HY000): Variable 'xxx' is a read only variable。必须确认变量同时满足两个条件:动态可改(IS_DYNAMIC = 'YES')且作用域为全局(VARIABLE_SCOPE = 'GLOBAL')。

查法很简单:

SELECT VARIABLE_NAME, VARIABLE_SCOPE, IS_DYNAMIC FROM performance_schema.variables_info WHERE VARIABLE_NAME = 'max_connections';
  1. 常见支持的:max_connectionswait_timeoutinnodb_buffer_pool_size(MySQL 8.0.22+)、log_bin(需配合 SET PERSIST_ONLY
  2. 典型不支持的:datadirportsocketserver_id——这些仍得改 my.cnf + 重启

SET PERSIST 和 SET PERSIST_ONLY 的区别在哪?

核心就一条:是否立刻改内存值。

  1. SET PERSIST max_connections = 500; → 内存立即变成 500,同时写入 mysqld-auto.cnf,重启后仍是 500
  2. SET PERSIST_ONLY log_bin = OFF; → 内存值不变(比如当前 binlog 还开着),只写进 mysqld-auto.cnf,下次重启才关闭 binlog

两者都写同一个文件:mysqld-auto.cnf(位于 SELECT @@datadir; 返回的路径下),JSON 格式,由 MySQL 自动管理。千万别手动编辑它——一个逗号错,MySQL 启动就失败。

执行前必须检查的三件事

报错基本不是语法问题,而是环境卡住了:

  1. 权限不足 → 报错 ERROR 1227 (42000): Access denied; you need SYSTEM_VARIABLES_ADMIN privilege。普通 root 默认没有这个权限,要显式授权:GRANT SYSTEM_VARIABLES_ADMIN ON *.* TO 'admin'@'%';
  2. 目录不可写 → 报错 ERROR 3615 (HY000): Cannot write to mysqld-auto.cnf。常见于容器挂载为只读、SELinux 启用、或数据目录属主不对
  3. 配置被覆盖 → 改完没生效?检查是否被 my.cnf 里同名参数干扰。注意:mysqld-auto.cnf 加载优先级最高,但前提是它被成功加载;可用 SHOW VARIABLES LIKE 'persisted_globals_load'; 确认该开关是否为 ON

验证是否真的落盘了?别只信 “Query OK”

命令返回成功不代表已持久化。得查两处:

  1. 查表:SELECT * FROM performance_schema.persisted_variables WHERE VARIABLE_NAME = 'max_connections'; —— 有记录说明已落盘
  2. 查文件:进数据目录(SELECT @@datadir; 确认路径),看是否存在 mysqld-auto.cnf,内容应为合法 JSON(不要打开编辑)
  3. 顺手清空某项?用 RESET PERSIST max_connections;;全清?用 RESET PERSIST;

最易忽略的是:即使设成和当前值一样的数,SET PERSIST 也会写入文件;但设为 DEFAULT(如 SET PERSIST max_connections = DEFAULT;)可清除该变量的持久化条目。

热门栏目