navicat不备份用户和权限是因其备份功能仅调用mysqldump/pg_dump等工具作用于指定数据库范围,而用户权限存储在mysql库(mysql)、pg_authid等系统表(postgresql)或master库(sql server)中,默认未被选中;需手动导出系统表或使用命令行工具(如mysqldump --databases mysql、pg_dumpall -r)并注意认证插件兼容性与刷新权限操作。
navicat 本身不备份用户和权限,它只备份数据库对象(表、视图、存储过程等)和数据;用户与权限属于系统级元数据,必须通过 sql 脚本导出或底层命令生成。
为什么右键“备份数据库”不包含用户和权限
Navicat 的 备份 功能本质是调用 mysqldump(MySQL)、pg_dump(PostgreSQL)或 sqlcmd(SQL Server),默认只作用于指定数据库(schema)范围内的对象。而用户账号、角色、全局权限(如 GRANT SELECT ON *.*)存储在系统库中:
• MySQL 存于 mysql 库的 user、db、tables_priv 等表
• PostgreSQL 存于 pg_authid、pg_roles、pg_grant 系统目录
• SQL Server 存于 master 库的 sys.server_principals 和 sys.database_principals
这些表默认不会被 Navicat 的常规备份选中。
MySQL:用 Navicat 导出 mysql 系统库 + 手动补全权限语句
要真正备份用户和权限,需分两步:
• 在 Navicat 中连接到 mysql 数据库(不是你的业务库),右键 →「导出向导」→ 选择表:user、db、tables_priv、columns_priv、procs_priv、proxies_priv
• 导出格式选 SQL,勾选「导出创建表语句」和「导出插入数据语句」
• 但注意:user 表里的密码字段(authentication_string)是哈希值,直接还原可能因 MySQL 版本差异导致登录失败
• 更可靠的做法是:在命令行运行 mysqldump --skip-lock-tables --no-create-info --compact -u root -p mysql user db tables_priv,再配合 SHOW GRANTS FOR 'xxx'@'%' 逐个导出可读权限语句
PostgreSQL:pg_dump 不带 -r 参数时默认不含角色
Navicat 调用 pg_dump 时若未显式启用角色导出,pg_roles 和 pg_auth_members 不会被包含:
• 在 Navicat 中无法通过界面开关开启「导出角色」,必须手动执行命令
• 正确做法是:用终端运行 pg_dumpall -r -U postgres > roles.sql(-r 表示 dump roles)
• 若只用 Navicat,可新建连接指向 postgres 或 template1,再导出 pg_authid、pg_auth_members、pg_database 等系统表,但需自行拼接 CREATE ROLE 和 GRANT 语句
• 注意:普通用户无权读取 pg_authid 的 rolpassword 字段,必须用超级用户执行
还原时权限容易失效的三个关键点
即使你导出了用户表或角色定义,还原后仍可能无法登录或授权:
• MySQL 8.0+ 默认认证插件是 caching_sha2_password,而旧备份里可能是 mysql_native_password,需在还原后手动 ALTER USER ... IDENTIFIED WITH mysql_native_password BY 'xxx'
• PostgreSQL 的 pg_dumpall -r 导出的 CREATE ROLE 语句不含密码(因密码已加密存储),必须额外用 \password 命令重设或在 SQL 中写明 ENCRYPTED PASSWORD
• 所有数据库还原用户后,必须显式执行 FLUSH PRIVILEGES(MySQL)或 SELECT pg_reload_conf()(PostgreSQL)才生效,Navicat 的「还原备份」操作不会自动触发这个步骤











