Navicat比对时目标库完全不显示,首要排查连接权限不足(如缺少SELECT或information_schema访问权)和连接配置中未指定目标数据库名(schema),其次检查库名大小写、多实例冲突及SSL设置等隐含前提。
Navicat比对时目标库完全不显示?先查连接权限和 schema 名
navicat 结构比对界面里目标库下空空如也,不是软件卡死,而是它根本没读到任何表。最常见原因是连接用户缺少 select 权限,或压根没访问 information_schema.tables 的能力。
实操建议:
- 用该账号直连目标库,执行
SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'your_target_db';—— 若返回空或报错Access denied,说明权限不足 - 确认你在 Navicat 连接设置里填的「数据库」字段是否为空。若留空,Navicat 默认只连接服务器,不自动加载任何 schema;必须手动填入目标库名(如
prod_db),否则比对时看不到该库下的表 - 检查目标库名是否拼写错误,尤其注意大小写:Linux 下 MySQL 表名和库名默认区分大小写,
MyDB和mydb是两个库
“仅显示缺失”没反应?别信界面按钮,先关掉结构比对逻辑
点“仅显示缺失”却看到一堆标着「不同」的同名表,这不是 Bug,是 Navicat 默认启用「表名 + 结构双重匹配」——只要字段类型、索引顺序、字符集(比如 utf8mb4_0900_ai_ci vs utf8mb4_general_ci)有差异,就归为「不同」,不会进「缺失」列表。
实操建议:
- 在比对设置 → 高级选项中,勾选「忽略字符集」和「忽略排序规则」——这对跨 MySQL 版本(5.7 ↔ 8.0+)比对特别关键
- 取消勾选「比较视图」「比较存储过程」等非表对象,避免干扰;「仅显示缺失」只对表生效,其他对象不参与该过滤
- 真正想查纯表名缺失,绕开界面,直接在目标库执行 SQL:
SELECT table_name FROM information_schema.tables WHERE table_schema = 'source_db' AND table_name NOT IN (SELECT table_name FROM information_schema.tables WHERE table_schema = 'target_db');
目标库明明存在,Navicat 却连到另一个空实例?查 Windows 服务状态
电脑重启后 Navicat 里目标库消失,但数据没丢——大概率是你本地装了多个 MySQL 实例(如 MySQL 和 MySQL80),而系统启动的是另一个服务,Navicat 连上了空库。
实操建议:
- 打开「服务」管理器(
services.msc),找所有以MySQL开头的服务,观察哪个状态是「正在运行」 - 停掉当前运行的服务(比如
MySQL),手动启动你原来用的那个(比如MySQL57或MySQL80) - 在 Navicat 连接属性里核对「主机」是否写成了
127.0.0.1(强制走 TCP)而非localhost(可能走 socket,路径指向不同实例)
导出的 .ncx 文件里没有密码,还原连接后仍连不上?检查导出时是否勾选「导出密码」
从旧系统迁移 Navicat 连接时,如果导入 .ncx 后连接测试失败,大概率是导出环节漏掉了关键一步:那个加密密码字段不会默认包含在导出文件里。
实操建议:
- 重新导出连接:菜单 → 文件 → 导出连接 → 勾选「导出密码」复选框(位置通常在对话框底部)→ 保存新
.ncx - 导入后仍连不上,用密码解密工具(如
navicat_password_decrypt)验证.ncx是否真含加密串:打开文件用文本编辑器搜索"password"字段,若无结果,说明导出失败 - 若目标库启用了 SSL,检查连接设置里的「SSL」选项卡是否同步开启,否则即使密码正确也会拒绝连接











