全量备份最小权限为select、show view、lock tables(innodb下可省);mysql 8.0+推荐用角色隔离授权;postgresql需connect、usage on schema、select on pg_catalog及目标对象;权限验证须覆盖边界场景。
全量备份需要哪些最小权限
数据库迁移工具做全量备份时,本质是读取所有表结构和数据,不是管理员操作,不需要 grant option 或 drop 权限。核心就三条:select、show view、lock tables(部分工具可绕过)。
常见错误现象:执行 mysqldump --all-databases 报错 Access denied; you need (at least one of) the SUPER or LOCK TABLES privilege(s) —— 其实只是缺 LOCK TABLES,不是真要 SUPER。
-
SELECT:必须,覆盖所有目标库表(包括information_schema中的元数据) -
SHOW VIEW:必须,否则无法导出视图定义 -
LOCK TABLES:仅当用--lock-all-tables或--single-transaction失败回退时才强制需要;InnoDB 下优先走--single-transaction可省掉它 - 不需要
CREATE、INSERT、ALTER,哪怕迁移含建表语句,也是目标端执行,非源端所需
MySQL 8.0+ 的角色机制怎么用更安全
直接 GRANT SELECT ON *.* 是高危操作,尤其在多租户或分库场景下容易越权。MySQL 8.0 起推荐用角色(ROLE)隔离权限边界。
使用场景:一个账号只负责备份 shop_db 和 log_db,不碰 sys_config 或其他业务库。
- 先创建角色:
CREATE ROLE 'backup_reader'; - 授权给角色:
GRANT SELECT, SHOW VIEW ON shop_db.* TO 'backup_reader';、GRANT SELECT, SHOW VIEW ON log_db.* TO 'backup_reader'; - 再把角色赋给用户:
GRANT 'backup_reader' TO 'migrate_user'@'%'; - 注意:必须执行
SET DEFAULT ROLE 'backup_reader' TO 'migrate_user'@'%';,否则权限不生效
PostgreSQL 中 pg_dump 对权限的实际要求
pg_dump 不依赖超级用户,但比 MySQL 更“挑剔”——它会主动查系统表、类型、扩展、策略,权限漏一条就可能卡在某个对象上。
典型错误:导出时报 permission denied for table pg_authid 或 no permission to read the system catalogs,其实只是缺对 pg_catalog 的 USAGE 和 SELECT。
- 必需:
CONNECT到目标数据库 +USAGEon schema(通常是public) - 必需:
SELECTon all tables/views you want to dump(含pg_catalog中的pg_class、pg_attribute等,否则元数据拿不全) - 如果导出自定义类型/函数/扩展,还需
USAGEon relevant schemas(如pg_catalog、information_schema) - 用
pg_dump -s(仅结构)时,SELECT不是必须的,但pg_dump内部仍会查系统表,所以SELECTonpg_catalog仍建议加上
权限验证不能只靠 “能跑通”,得测边界
很多团队配完权限就跑一次 mysqldump 或 pg_dump,看到有输出就认为 OK,结果上线后某张新表或视图一加,迁移立刻失败。
真正有效的验证方式,是模拟真实迁移路径中可能触发的访问点:
- 检查是否能
SELECT所有目标表(包括空表、带特殊字符名的表、分区表子表) - 手动执行
SHOW CREATE VIEW xxx;或\d+ view_name,确认视图定义可读 - 如果用逻辑复制或 CDC 工具(如 Debezium),还要额外加
REPLICATION权限,并验证pg_replication_slots可查(PG)或BINLOG权限可用(MySQL) - 权限变更后,别忘了重连——MySQL 的
FLUSH PRIVILEGES不影响已存在连接,PostgreSQL 需要重新psql连入
最常被忽略的一点:迁移工具往往会在连接后自动执行 SELECT VERSION()、SELECT @@sql_mode 或 SHOW SERVER_ENCODING,这些看似“只读”的语句,背后依赖的是对 performance_schema 或 pg_settings 的查询权限,漏掉就会静默失败。











