<p>必须显式授予SYSTEM_VARIABLES_ADMIN权限且严格匹配'user'@'host',执行GRANT SYSTEM_VARIABLES_ADMIN ON . TO 'user'@'host';后立即生效,无需FLUSH PRIVILEGES。</p>

SET PERSIST 报错 ERROR 1227 怎么办
直接原因是没给对权限——SYSTEM_VARIABLES_ADMIN 必须显式授予,且严格匹配连接时的 'user'@'host'。哪怕你用 root@localhost 登录,只要没执行过 GRANT SYSTEM_VARIABLES_ADMIN ON *.* TO 'root'@'localhost';,照样报错。
常见错误现象:
- 执行
SET PERSIST max_connections = 5000;提示ERROR 1227 (42501): Access denied; you need (at least one of) the SYSTEM_VARIABLES_ADMIN privilege(s) -
SHOW GRANTS FOR CURRENT_USER;输出里没有SYSTEM_VARIABLES_ADMIN
实操建议:
- 确认当前连接身份:
SELECT USER(), CURRENT_USER();,取USER()的结果(即实际连接用的'user'@'host') - 用该组合授予权限:
GRANT SYSTEM_VARIABLES_ADMIN ON *.* TO 'admin'@'192.168.1.5';(别写'%',生产环境限定 IP) - 授完不用
FLUSH PRIVILEGES,权限立即生效 - 验证:
SHOW GRANTS FOR 'admin'@'192.168.1.5';
哪些变量能用 SET PERSIST 持久化
不是所有全局变量都支持。MySQL 8.0 要求变量同时满足 IS_DYNAMIC = 'YES' 且 VARIABLE_SCOPE = 'GLOBAL',否则直接报错 ERROR 1238 (HY000): Variable 'xxx' is a read only variable。
查前先确认:
- 查单个变量:
SELECT VARIABLE_NAME, VARIABLE_SCOPE, IS_DYNAMIC FROM performance_schema.variables_info WHERE VARIABLE_NAME = 'innodb_buffer_pool_size'; - 支持的典型变量:
max_connections、wait_timeout、sort_buffer_size(8.0.22+ 支持innodb_buffer_pool_size) - 不支持的:
datadir、port、log_bin(需配合SET PERSIST_ONLY)、protocol_version
注意:SET PERSIST_ONLY log_bin = OFF; 只写入 mysqld-auto.cnf,当前值不变,重启才生效——这是为避免 binlog 中断导致主从异常留的安全路径。
SET PERSIST 写不进 mysqld-auto.cnf 怎么排查
权限有了、变量也支持,但 SET PERSIST 看似成功,重启后配置却丢了——大概率是文件系统层失败,MySQL 不报错,只记日志。
关键检查点:
-
mysqld-auto.cnf所在目录是否可写?路径通常是 MySQL 数据目录(SELECT @@datadir;),检查ls -ld $(mysql -Nse "SELECT @@datadir")权限和磁盘剩余空间 - SELinux 或容器挂载是否限制写入?
grep "mysqld-auto.cnf" /var/log/mysqld.log查是否有Failed to open file或Permission denied - 验证是否落盘:
SELECT * FROM performance_schema.persisted_variables WHERE VARIABLE_NAME = 'max_connections';,或直接cat $(mysql -Nse "SELECT @@datadir")/mysqld-auto.cnf - 误删或手动编辑过
mysqld-auto.cnf?该文件由 MySQL 自动管理,损坏会导致启动时跳过加载
RESET PERSIST 清理后还残留怎么办
RESET PERSIST max_connections; 会从 mysqld-auto.cnf 和 performance_schema.persisted_variables 中移除该变量记录,但若文件 JSON 格式已损坏,MySQL 启动时可能静默忽略整个文件。
真正容易被忽略的是:
-
RESET PERSIST不影响当前运行值,只清持久化记录 - 清完必须验证:
SELECT COUNT(*) FROM performance_schema.persisted_variables WHERE VARIABLE_NAME = 'max_connections';应返回 0 - 如果
mysqld-auto.cnf文件存在但为空或格式错误,MySQL 启动日志里会有Could not parse persisted variables file提示,但不会中断启动 - 备份习惯:改之前
cp mysqld-auto.cnf mysqld-auto.cnf.bak,比事后恢复快得多


















