MySQL 8.0+中迁移工具报“权限不足”时不应加SUPER,因其已被拆分为细粒度动态权限且GRANT SUPER无效;应按阶段授予SELECT、REPLICATION CLIENT/SLAVE、DDL等最小必要权限,并确保host精确匹配与认证插件兼容。

迁移工具报“权限不足”时别急着加 SUPER
MySQL 8.0+ 中 SUPER 已被拆分为数十个细粒度动态权限(如 SET_USER_ID、ENCRYPTION_KEY_ADMIN),直接 GRANT SUPER ON *.* 不仅无效,还会掩盖真实缺失权限。云数据库(如阿里云 RDS、PolarDB)甚至会静默忽略该语句。遇到 ERROR 1227 (42000): Access denied; you need (at least one of) the SUPER privilege(s),应先查具体操作阶段再补对应权限。
全量 + 增量迁移必需的最小权限组合
不同迁移阶段依赖完全不同的权限,硬塞一个“高权限账号”反而容易触发审计拦截或连接失败:
- 全量读取:必须有
SELECT(目标库表)、SHOW VIEW、LOCK TABLES(若未设--skip-lock-tables) - 增量同步(Binlog):缺一不可——
REPLICATION CLIENT(查MASTER STATUS) +REPLICATION SLAVE(拉取 binlog event) - 自动建库建表:只授目标库范围,例如
GRANT CREATE, ALTER, DROP ON `target_db`.* TO 'dts'@'10.20.30.%' - 跨库对象(函数/触发器):额外加
EXECUTE和TRIGGER,但禁止ON *.*
FILE 权限对远程迁移毫无用处且危险
FILE 是服务器本地文件读写权限,只影响 LOAD DATA INFILE 或 SELECT ... INTO OUTFILE,而所有主流迁移工具(mysqldump、pt-table-sync、DTS)走的是网络协议,完全不经过该路径。盲目授予 FILE 反而让攻击者可读取 /etc/passwd 等敏感文件;MySQL 8.0 默认禁用 secure_file_priv,即使有该权限,INTO OUTFILE 也会报 ERROR 1290 (HY000)。
host 匹配和认证插件是权限生效的隐形门槛
权限是否生效,不只看 GRANT 语句,更取决于连接时解析出的真实 host 和认证方式:
- 检查应用实际来源:
SELECT host FROM information_schema.processlist WHERE user='dts';,然后用该 host 执行SHOW GRANTS FOR 'dts'@'真实IP' - MySQL 8.0 默认用
caching_sha2_password,旧客户端(如 PHP 7.2、某些 JDBC 驱动)会报Authentication plugin 'caching_sha2_password' cannot be loaded,需在目标库执行ALTER USER 'dts'@'10.20.30.%' IDENTIFIED WITH mysql_native_password BY 'xxx' - 若新服务器未设
skip_name_resolve=ON,DNS 反查失败会导致 host 匹配失败,权限静默失效
真正难的不是写 GRANT 语句,而是确认迁移工具实际调用了哪些 SQL、连接来自哪个 IP、用什么插件认证——这些细节不验证,权限再“全”也白搭。


















