RELOAD权限只能全局授予,因其是MySQL服务器级权限,对应FLUSH类操作(如FLUSH LOGS、FLUSH TABLES WITH READ LOCK),这些命令影响整个实例状态,无法限定到库或表;写成ON mydb.会静默失败,必须用ON .*。

RELOAD 权限必须用 GRANT RELOAD ON *.* 授予,且只能全局授予——它不作用于库或表级,写成 ON mydb.* 会静默失败。
为什么 RELOAD 权限只能全局授予?
MySQL 的 RELOAD 是全局权限(Global Privilege),底层对应 FLUSH 类操作,比如 FLUSH TABLES WITH READ LOCK、FLUSH LOGS 等。这些命令影响整个实例,无法限定到某个库。如果你误写成:
GRANT RELOAD ON app_db.* TO 'bkp'@'localhost';
MySQL 不报错,但权限实际没生效——执行 mysqldump --lock-all-tables 或触发 fallback 锁时仍会报 Access denied; you need (at least one of) the RELOAD privilege(s)。
-
RELOAD必须搭配*.*,不能带库名或表名 - 即使只备份单个库,也得走全局授权路径
- 云数据库(如阿里云 RDS)允许该语句,但部分托管服务会限制
RELOAD使用场景,需确认控制台是否开放
mysqldump 哪些参数实际依赖 RELOAD?
不是所有备份模式都需要 RELOAD,但它在关键 fallback 场景中起兜底作用:
-
--single-transaction:InnoDB 表默认用一致性快照,RELOAD不触发——但若事务启动失败(如长事务阻塞、innodb_lock_wait_timeout超时),mysqldump会自动降级为FLUSH TABLES WITH READ LOCK,此时缺RELOAD直接失败 -
--lock-all-tables:强制使用全局锁,RELOAD+LOCK TABLES缺一不可 -
--master-data=2:导出 binlog 位置时,内部会调用FLUSH TABLES,需要RELOAD - 混合引擎(InnoDB + MyISAM):MyISAM 表不支持事务快照,
mysqldump必须加全局锁,RELOAD成为硬性要求
授完 RELOAD 后为什么 mysqldump 还报错?
常见假阳性错误不是权限没给,而是权限给了但没生效,或被其他权限细节掩盖:
- 用户 host 不匹配:
'bkp'@'localhost'和'bkp'@'127.0.0.1'是两个独立账户,远程连接时务必确认实际登录 host - 漏了
LOCK TABLES:即使有RELOAD,mysqldump默认仍尝试LOCK TABLES,没这权限照样报错 - 没给
SELECT:RELOAD不提供读能力,SELECT权限必须按库显式授予,例如GRANT SELECT ON app_db.* TO 'bkp'@'localhost' - 用了
%通配 host 但 MySQL 8.0+ 密码插件不兼容:检查SHOW CREATE USER 'bkp'@'%'确认认证插件是caching_sha2_password还是mysql_native_password,必要时指定插件重建用户
真正麻烦的不是加权限,而是把 RELOAD 和 LOCK TABLES、SELECT 按实际备份范围组合到位——少一个,mysqldump 就在某个边缘场景下突然失败,而日志里只显示模糊的 “Access denied”。


















