必须用“转储数据库”而非“导出数据”导出用户和权限,因后者仅生成INSERT/CREATE TABLE语句,而前者调用mysqldump--users、pg_dumpall-r或expdp等原生命令导出CREATE USER、GRANT等完整安全对象。

导出用户和权限脚本必须用“转储数据库”,不是“导出数据”
“导出数据”功能只处理表内容(INSERT语句)或结构(CREATE TABLE),它完全忽略用户、角色、权限等安全对象。真正能导出 CREATE USER、GRANT、ALTER DEFAULT PRIVILEGES 等语句的,只有 DBeaver 的 转储数据库(Dump Database) 功能——它调用的是底层数据库原生命令(如 mysqldump --all-databases --users、pg_dumpall -r、Oracle 的 expdp 等),而非通用导出逻辑。
常见错误现象:
右键表 → “导出数据” → 选 SQL 格式 → 生成的文件里没有 GRANT,甚至没有 CREATE USER;或者只看到一堆 INSERT 和 CREATE TABLE,误以为“权限已包含”。
- MySQL:需确保连接用户有
SELECT权限访问mysql.user、mysql.db、mysql.tables_priv等系统表,且 DBeaver 驱动启用includeAllUsers=true参数(部分版本需手动添加到连接 URL) - PostgreSQL:必须使用
pg_dumpall -r模式,对应 DBeaver 中选择“转储全部数据库(包括角色和表空间)”,仅选单个数据库无法导出全局角色 - Oracle:DBeaver 的图形化转储不直接支持导出用户/权限(因 Oracle 权限模型复杂),应改用命令行
expdp+CONTENT=METADATA_ONLY+INCLUDE=USER,ROLE_GRANT,SYSTEM_GRANT
MySQL 用户权限导出:关键参数和易错点
在 MySQL 连接上右键 → “工具” → “转储数据库”,然后重点检查以下配置项:
- 勾选 “包含用户和权限”(部分 DBeaver 版本显示为
Include users and privileges)——这是开关,不勾则无任何CREATE USER或GRANT - 取消勾选 “仅转储数据”(
Only data),否则跳过所有 DDL,包括权限语句 - 若目标是迁移用户到另一台 MySQL,务必勾选 “包含创建数据库语句”(
Create database),否则GRANT ON db.*可能因库不存在而执行失败 - 避免使用
--skip-triggers或--skip-routines类高级选项,它们有时会意外抑制权限相关元数据读取
导出后检查生成的 SQL 文件开头是否有类似这样的块:
CREATE USER 'app_user'@'%' IDENTIFIED WITH 'caching_sha2_password' AS '$A$...'; GRANT SELECT, INSERT ON `myapp`.* TO 'app_user'@'%';
如果没有,说明转储未启用权限导出,或当前连接用户权限不足(例如普通应用账号无法读 mysql.user)。
PostgreSQL 角色与权限导出:必须用 pg_dumpall -r
DBeaver 对 PostgreSQL 的“转储数据库”功能分两档:
– 单库转储(pg_dump):只导出该库内对象(表、函数、schema-level GRANT),不导出角色(role)、登录权限、数据库级 GRANT
– 全局转储(pg_dumpall -r):导出所有角色定义、ALTER ROLE、GRANT ... ON DATABASE、默认权限等
操作路径:
右键 PostgreSQL **根节点**(不是某个数据库,而是带“PostgreSQL”字样的顶层连接名)→ “工具” → “转储数据库” → 在“转储类型”下拉菜单中明确选择 “转储全部数据库(包括角色和表空间)”。
- 如果只右键某个具体数据库(如
mydb)并点击“转储”,哪怕勾选了“包含权限”,也只会输出GRANT SELECT ON TABLE public.users TO app_role;这类语句,不会出现CREATE ROLE app_role LOGIN; - 导出文件中应包含
CREATE ROLE、ALTER ROLE ... PASSWORD、GRANT app_role TO another_role;等完整链路 - 注意:密码哈希值会被导出,但若目标集群启用了
password_encryption = scram-sha-256而源是 md5,需手动替换或调整目标配置
Oracle 权限导出不走 DBeaver 图形界面,得用 expdp 命令
DBeaver 的“转储数据库”对 Oracle 实际调用的是 exp/expdp,但其图形界面**不暴露 INCLUDE 参数控制粒度**,无法精确指定只导出用户和权限。强行用 DBeaver 导出整个数据库,会混入大量表数据,难以分离。
推荐做法是绕过 DBeaver 图形界面,直接使用命令行 expdp 并配合参数精准导出:
expdp system/password@orcl FULL=Y CONTENT=METADATA_ONLY INCLUDE=USER,ROLE,ROLE_GRANT,SYSTEM_GRANT,OBJECT_GRANT,DEFAULT_ROLE,RESOURCE_COST- 导出结果是
.dmp文件,需用impdp+SQLFILE=xxx.sql转成可读 SQL:impdp system/password@orcl DUMPFILE=users.dmp SQLFILE=grants.sql - 这样生成的
grants.sql就是纯权限脚本,不含任何表数据,可直接在目标库运行 - 注意:
expdp必须由具有EXP_FULL_DATABASE角色的用户执行,普通SELECT_CATALOG_ROLE不够
真正容易被忽略的点是:Oracle 权限依赖顺序(先 CREATE USER,再 GRANT,再 ALTER DEFAULT PRIVILEGES),SQLFILE 输出的语句顺序未必合理,需人工校验或加 ORDER=SCHEMA 参数控制。

















