backup_admin必须搭配reload、lock tables、replication client、process及select on performance_schema.log_status等权限才能完成备份;单独授予会因缺失关键操作权限导致xtrabackup或mysqlbackup报错。

BACKUP_ADMIN 不能单独存在,必须搭配其他权限才能真正用于备份;直接 GRANT BACKUP_ADMIN ON *.* 就完事,备份工具会立即报错。
为什么必须用角色而不是直接给用户授 BACKUP_ADMIN
角色是 MySQL 8.0+ 唯一可复用、可审计、可解耦的权限容器。不建角色,就只能对每个备份用户重复执行一长串 GRANT,漏掉 SELECT ON performance_schema.log_status 或 RELOAD 是高频事故点。角色还能和 SET DEFAULT ROLE 绑定,避免用户登录后手动 SET ROLE 忘记激活——而后者在未启用 activate_all_roles_on_login 时会导致权限“看起来给了,实际没生效”。
- 必须先确认
activate_all_roles_on_login是否为ON:SELECT @@activate_all_roles_on_login; - 若为
OFF,临时启用:SET GLOBAL activate_all_roles_on_login = ON;;永久生效需在my.cnf中加activate_all_roles_on_login = ON - 角色名建议带语义前缀,如
'backup_role',避免与用户名或库名冲突
创建角色并授予最小必要权限组合
BACKUP_ADMIN 自身只管锁实例、读日志状态,其余操作(锁表、刷日志、查 binlog 位点)全靠配套权限。少任何一项,xtrabackup 或 mysqlbackup 都会中断并报具体缺失项,比如 “Access denied; you need LOCK TABLES” 或 “Cannot read log_status”。
- 创建角色:
CREATE ROLE 'backup_role'; - 授动态权限(对象固定为
*.*):GRANT BACKUP_ADMIN ON *.* TO 'backup_role'; - 授静态权限(同样作用于全局):
GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT, PROCESS ON *.* TO 'backup_role'; - 关键易漏项:
GRANT SELECT ON performance_schema.log_status TO 'backup_role';—— 这个不包含在任何全局权限里,必须显式给 - 如果用
mysqlbackup,还需额外给mysql.backup_history相关权限:GRANT CREATE, INSERT, DROP, UPDATE, SELECT, ALTER ON mysql.backup_history TO 'backup_role';
把角色绑定到用户并激活
用户获得角色后默认不激活,除非显式设置默认角色或全局启用自动激活。否则 SHOW GRANTS 里看不到角色赋予的权限,备份脚本会静默失败。
- 创建专用备份用户:
CREATE USER 'backup_user'@'10.0.1.%' IDENTIFIED BY 'strong_pass_2026'; - 把角色授给用户:
GRANT 'backup_role' TO 'backup_user'@'10.0.1.%'; - 设为默认角色(推荐):
SET DEFAULT ROLE 'backup_role' TO 'backup_user'@'10.0.1.%'; - 刷新权限缓存:
FLUSH PRIVILEGES;—— MySQL 8.0+ 动态权限仍需这步才生效 - 验证是否生效:
SHOW GRANTS FOR 'backup_user'@'10.0.1.%';输出中应含GRANT BACKUP_ADMIN ON *.*和所有配套权限行
撤销或调整权限时最容易踩的坑
撤销 BACKUP_ADMIN 不能用老式语法,且已建立的连接不会立刻失效——这点常被忽略,导致“明明 revoke 了,备份还在跑”。
- 错误写法:
REVOKE BACKUP_ADMIN ON *.* FROM 'backup_user'@'10.0.1.%';→ 报错ERROR 3724 - 正确写法:
REVOKE SYSTEM PRIVILEGE BACKUP_ADMIN FROM 'backup_user'@'10.0.1.%'; - 撤销后,当前连接仍持有该权限,必须让备份用户重连(或 kill 对应线程)才真正失效
- 不能合并撤销多个动态权限:
REVOKE SYSTEM PRIVILEGE BACKUP_ADMIN, RELOAD FROM ...是语法错误 - 删角色前确保没人用:
DROP ROLE 'backup_role';会级联清除所有关联授权,但不会自动回收已授出的角色引用
最麻烦的不是配不全权限,而是配全了却因 activate_all_roles_on_login = OFF 或忘记 SET DEFAULT ROLE 导致权限“隐身”。上线前务必用备份用户直连,执行 SHOW GRANTS; 和 SELECT * FROM performance_schema.log_status; 双重验证。











