迁移工具需select on .、select on information_schema.、show view on .*三项权限,缺一不可;严禁授予all privileges或reload等高危权限,8.0+角色权限无需flush privileges。

迁移工具需要哪些权限才能读全库但不越界
数据迁移工具(如 mysqldump、mydumper、DTS 或自研同步程序)要完整导出数据,核心依赖的是 SELECT 权限,但仅靠 GRANT SELECT ON *.* 不够——它无法访问系统库元数据,8.0+ 还可能被默认限制。
必须显式授予以下三项:
-
SELECTON*.*:读取所有业务库表数据(不含系统库) -
SELECTONinformation_schema.*:获取表结构、列定义、索引等元信息(老版本必需;8.0.29+ 若已设show_compatibility_56=OFF,则需额外REVOKE SELECT ON information_schema.*后重授) -
SHOW VIEWON*.*:否则mysqldump遇到视图会报错Access denied; you need (at least one of) the SHOW VIEW privilege(s)
注意:GRANT SELECT ON *.* 默认不包含 performance_schema 和 sys,迁移工具一般也不需要,不必额外开;若用 mysqlpump 且启用了 --all-databases,才需确认是否含 sys。
为什么不能直接 GRANT ALL PRIVILEGES ON *.*
因为 GRANT ALL PRIVILEGES ON *.* 实际授予的是「当前存在且未来新建的所有数据库」的全部权限,包括 DROP DATABASE、CREATE USER、SHUTDOWN 等高危操作权限。迁移工具根本不需要这些。
更危险的是,如果该账号后续被误用于连接池或配置泄露,攻击者可直接删库、提权、甚至停服。
典型错误现象:
- 执行
mysqldump --all-databases成功,但日志里反复出现Warning: Cannot read table structure for ... - 工具在导出视图时报错
Access denied for user ... to database 'information_schema' - DBA 发现迁移账号在监控中执行了
FLUSH TABLES WITH READ LOCK——这说明它被赋予了RELOAD权限,远超最小需求
锁表权限(RELOAD)到底要不要给
绝大多数现代迁移工具(mysqldump --single-transaction、mydumper、mysqlpump)默认走 MVCC 快照,**完全不需要锁表**,也就不需要 RELOAD 权限。
只有两类场景才需谨慎评估是否开 RELOAD:
- 使用
mysqldump --lock-all-tables或--master-data(非 GTID 模式下抓位点),此时需RELOAD才能执行FLUSH TABLES WITH READ LOCK - 目标端是只读从库,需先
STOP SLAVE再导入,此时还要加SLAVE ADMIN(8.0.26+)或SUPER(旧版)
结论:除非明确启用锁表模式,否则一律不授 RELOAD。若必须启用,建议单独建账号、限定 host、并配 MAX_USER_CONNECTIONS 1 防并发锁库。
MySQL 8.0+ 的特殊坑:角色权限与 FLUSH PRIVILEGES
在 8.0+ 中,如果你用角色(ROLE)管理迁移账号权限(例如创建 migration_role 并赋予权限,再 GRANT migration_role TO 'dumper'@'10.20.%'),要注意:
-
FLUSH PRIVILEGES对角色权限**完全无效**,执行了也没用;必须用SET ROLE DEFAULT或重新连接才能激活 - 角色本身不能带
WITH GRANT OPTION,所以无法通过角色把SELECT转授出去——这是好事,但也要意识到:你不能靠角色实现“迁移账号授权其他账号”这种需求 - 如果迁移脚本里混用了
INSERT INTO mysql.user(绕过权限系统)和GRANT,FLUSH PRIVILEGES必须放在所有INSERT之后、GRANT之前,否则权限状态不一致
最容易被忽略的一点:迁移完成后,别忘了运行 SHOW GRANTS FOR 'dumper'@'10.20.%',确认输出里没有 USAGE 以外的隐式权限(比如因历史遗留导致的 ALL PRIVILEGES ON performance_schema.*),有就立刻 REVOKE。











