set persist仅能持久化动态全局变量(如max_connections、log_bin),不能记录备份参数;备份相关配置须由外部脚本或独立配置文件管理,mysqld-auto.cnf不存储非系统变量。

SET PERSIST 不能直接记录备份参数
MySQL 8.0 的 SET PERSIST 只能持久化**运行时可动态修改的系统变量**,而备份本身不是变量——mysqldump、xtrabackup 等工具的参数(如 --target-dir、--compress)完全由外部命令控制,MySQL 服务器根本不感知也不存储这些值。试图执行 SET PERSIST backup_target_dir='/backup/full' 会报错 ERROR 1193 (HY000): Unknown system variable。
真正能用 SET PERSIST 持久化的相关变量只有几个
虽然不能记“备份命令”,但部分影响备份行为的底层变量可通过 SET PERSIST 固化,避免每次重启后重设:
-
max_connections:影响备份期间并发连接数,SET PERSIST max_connections = 500; -
innodb_log_file_size:影响 XtraBackup 增量日志解析稳定性,但需配合SET PERSIST_ONLY+ 重启 -
log_bin和binlog_format:开启并规范二进制日志,是 Point-in-Time 恢复前提,SET PERSIST log_bin = ON;(注意:datadir、socket等只读变量不支持持久化) -
default_authentication_plugin:若备份用户用的是mysql_native_password,此变量必须设对,否则备份脚本连不上
备份参数该存在哪儿?别依赖 mysqld-auto.cnf
mysqld-auto.cnf 是 MySQL 自己生成的 JSON 文件,只存系统变量,**不会、也不能存你写的备份脚本路径或压缩线程数**。把备份逻辑硬编码进数据库配置,等于把运维脚本和数据库耦合,极其危险:
- 备份目录路径(如
/mydata/backup/xtrabackup/full)必须由 shell 脚本或调度器(cron / Jenkins)管理,而非写进mysqld-auto.cnf - 密码类敏感参数严禁明文出现在任何 MySQL 配置中;应使用
--defaults-extra-file指向独立权限受限的文件(如/etc/mybackup.cnf,chmod 600) - 如果真想“记录”参数,用版本化脚本+注释:比如在
/mydata/script/backup_full.sh头部写# xtrabackup --parallel=4 --compress-threads=2 --target-dir=/mydata/backup/xtrabackup/full
容易被忽略的关键点:PERSIST 不等于自动生效
有些变量用 SET PERSIST 后看似改了,但实际没起效:
-
innodb_buffer_pool_size这类变量需重启才加载新值,SET PERSIST只保证下次启动时读取,当前会话仍用旧值 - 若
mysqld-auto.cnf所在目录(即datadir)权限不对(比如属主不是mysql用户),MySQL 启动时会静默跳过该文件,导致持久化失效 -
SET PERSIST_ONLY修改的变量,必须确认其是否属于“requires restart”类型——查information_schema.performance_schema.variables_info表的READ_ONLY和RESTART_REQUIRED字段











