Navicat模型与数据库默认为单向快照关系,修改表后“同步到数据库”无反应,因该功能仅推送模型变更,不感知数据库已变;须手动执行Reverse Engineer反向工程更新模型。
Navicat 模型里改了表,为什么右键「同步到数据库」没反应?
根本原因不是功能失效,而是 navicat 的模型(model)和数据库(database)之间默认是「单向快照」关系——模型创建时导出的是结构快照,后续数据库手动变更(比如 alter table 加字段),模型不会自动感知。必须主动触发「反向工程」或「比较并同步」。
- 真正生效的操作是:在模型编辑器中右键模型 → 选择
Reverse Engineer...(反向工程),重新从目标数据库拉取最新结构 - 如果只想更新部分表,先在模型里删掉对应表,再执行
Reverse Engineer,勾选要导入的表即可 - 注意:反向工程会覆盖模型中对该表的所有手工修改(比如自定义注释、布局位置),建议提前导出
.mwb备份或用版本控制管理 - 「同步到数据库」(
Synchronize to Database...)只负责把模型里的改动推过去,不解决“数据库已变、模型滞后”的问题
用「Synchronize to Database」前,必须确认的三件事
这个功能本质是生成 DDL 差异脚本并执行,但 Navicat 不校验业务逻辑影响,也不锁表——推错就直接炸库。
- 确认当前连接的数据库是目标环境(开发/测试),且用户有
ALTER、DROP、CREATE权限;生产环境务必禁用此功能 - 勾选
Generate synchronization script only先预览 SQL,重点检查是否含DROP COLUMN、MODIFY COLUMN等高危操作 - 若模型里删了字段,而数据库该字段有存量数据,默认同步会直接
DROP COLUMN;如需保留数据,得手动改生成的 SQL,加RENAME COLUMN或用临时字段迁移
模型和数据库结构不一致时,「Compare」按钮为啥灰掉?
因为 Navicat 要求模型和数据库必须属于同一类型且版本兼容。比如用 MySQL 8.0 建的模型,连到 MySQL 5.7 实例上,Compare 功能会被禁用——它底层依赖 INFORMATION_SCHEMA 的字段语义,跨大版本可能列缺失或含义变化。
- 检查模型属性:右键模型 →
Model Properties→ 确认DBMS和Version与目标数据库严格一致 - 若连的是阿里云 RDS 或腾讯云 CVM 上的 MySQL,注意它们可能隐藏了部分系统表,导致
Compare获取元数据失败;可尝试切换为普通自建 MySQL 实例验证是否环境问题 - PostgreSQL 模型连到
pg_catalog权限受限的实例时,也会灰掉;需确保连接用户有SELECT权限在pg_class、pg_attribute等系统表
自动化同步模型的唯一可靠方式:别依赖 Navicat GUI
Navicat 没有 CLI 工具,也不支持模型变更监听或 Webhook 回调。所谓「自动同步」只能靠外部脚本驱动。
- 用
mysqldump --no-data或pg_dump --schema-only定期导出 DDL,再用 diff 工具比对与模型导出的.sql文件(模型 →File → Export → SQL File) - 把模型文件
.mwb当作源码,放入 Git;每次数据库变更后,人工跑一次Reverse Engineer,提交新版本模型——这才是团队协作中最可控的做法 - 想绕过 GUI?Navicat 不开放模型文件解析协议,
.mwb是二进制加密格式,目前无稳定第三方解析库;别浪费时间写解析器
Reverse Engineer 上。最常被跳过的步骤,恰恰是每次上线前打开模型、按 F5 刷新再核对的那三秒钟。










