Navicat 不支持用户与权限的直接对比,因其结构对比功能仅处理DDL对象,不采集mysql.user等系统表;必须通过手动执行指定SQL查询导出用户、数据库级及列级权限快照,再用文本工具比对。
Navicat 本身不支持直接对比用户和权限配置
navicat 的「结构对比」功能只处理数据库对象(表、视图、存储过程等)的 ddl,information_schema 中的用户和权限元数据(如 mysql.user、mysql.db)不会被采集或比对。你点「工具 → 结构对比」,无论选哪两个连接,都不会出现用户、主机、密码哈希、grant 语句等差异项。
必须用 SQL 手动导出并 diff 用户权限快照
真实可行的做法是:分别从源库和目标库执行固定查询,导出结果后做文本比对。关键不是“怎么点”,而是“查什么”:
-
SELECT User, Host, authentication_string, account_locked, password_expired FROM mysql.user ORDER BY User, Host;—— 用户基础信息(含锁状态、过期标记) -
SELECT User, Host, Db, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Grant_priv FROM mysql.db ORDER BY User, Host, Db;—— 数据库级权限(注意:mysql.db不包含通配符*权限,仅显式授权库) -
SELECT User, Host, Table_schema, Table_name, Column_name, Select_priv, Insert_priv, Update_priv FROM mysql.columns_priv ORDER BY User, Host, Table_schema, Table_name;—— 列级权限(极少用,但存在即需覆盖)
导出为 CSV 或 TXT 后,用 diff 命令、VS Code 插件或 WinMerge 对比。别依赖 Navicat 自带的「导出向导」——它默认不导出系统库,需手动勾选 mysql 库并确认「导出结构和数据」。
Navicat 权限管理员界面不能跨连接对比
「权限管理员」(Privilege Manager)是个单连接上下文工具:它只能查看/修改当前所选连接的权限分配,无法把 A 连接的用户列表拉到 B 连接里做勾选比对。常见误操作是打开两个连接标签页,然后幻想拖拽权限过去——这在 UI 层根本不存在交互路径。
更隐蔽的坑是:权限管理员显示的「服务器权限」实际映射的是 mysql.user 表中对应字段(如 Super_priv),但它**不展示** Grant_priv 是否启用(影响能否再授予权限),也不显示 max_questions 等资源限制值。这些字段必须靠上面 SQL 查询才能暴露。
真正要对比权限,得绕开 Navicat 图形界面
图形化工具在这里只是执行 SQL 的壳。如果你需要自动化比对(比如 CI 流程中验证测试库与生产库权限一致性),直接写脚本调用 mysqldump --no-create-info --skip-triggers --compact mysql user db columns_priv,再用 grep -v "^-- " | sort 清洗后 diff。Navicat 的「SQL 预览」功能虽能生成 GRANT 语句,但它只基于当前编辑中的单个用户,没法批量生成全量权限快照——这个缺口,必须由 SQL 填上。


















