Navicat Premium跨库同步必须用“数据传输”而非“数据同步”,因后者仅支持同类型数据库且要求结构严格一致;异构库(如MySQL→PostgreSQL)必须通过工具→数据传输实现,需预建目标表、配置字段映射与权限,并依赖命令行+系统调度实现定时任务。
Navicat Premium 跨库同步必须用「数据传输」,不是「数据同步」
跨 mysql→postgresql、oracle→mysql 这类异构库同步,数据同步 功能完全不可用——它只支持同类型数据库(如 mysql→mysql),且要求表结构严格一致。真正能跑通的只有 数据传输 向导,路径是:工具 → 数据传输。
常见错误现象:点开「数据同步」后选了 Oracle 源和 MySQL 目标,下一步直接报错 Unsupported database type combination,或卡在连接测试环节。
- 「数据同步」底层走的是行级比对 + SQL 生成逻辑,依赖相同 SQL 方言和类型系统,跨库时连
TINYINT和BOOLEAN映射都崩 - 「数据传输」则绕过 DDL 比对,直接读取源库结果集、按目标库类型做字段转换、拼 INSERT/UPDATE 语句,兼容性高得多
- 即使同为 MySQL,若源库字符集是
utf8mb4、目标库是utf8,也得进「高级选项」勾选忽略字符集转换错误,否则含 emoji 的整行静默跳过
目标表必须预先存在,且主键/唯一索引要对齐
数据传输 不会自动建表,它默认假设目标库中对应表已存在。如果目标表缺失,任务会失败,但日志里只显示 Execution failed,不提示具体缺哪张表。
使用场景:把生产库的 orders 表同步到测试库,测试库必须提前有同名表,且至少有一个主键或唯一索引字段(如 id 或 order_no),否则无法启用「更新匹配记录」模式。
- 字段名不一致?进「字段映射」页手动绑定,比如源库的
create_time→ 目标库的created_at - 字段类型不兼容?例如源是
TEXT、目标是VARCHAR(50),Navicat 默认跳过该列,不报错也不警告 - 目标库用户权限不足?需明确授予
INSERT、UPDATE、DELETE,只给SELECT会导致卡在「正在写入第 X 行」
定时跨库同步只能靠命令行 + 系统调度,GUI 计划功能形同虚设
Navicat Premium 的内置「计划」模块只对「数据同步」有效,而「数据传输」无法被加入计划任务。所谓「定时同步」,实际是用命令行调用已保存的 .ntx 配置文件,再套系统级调度器。
Windows 下可用:navigator.exe --transfer "C:\Tasks\sync_orders.ntx";macOS/Linux 则不行——navicatCLI 工具根本不支持 --transfer 参数,官方没提供替代方案。
- 保存配置时务必勾选「隐藏进度窗口」,否则后台执行会弹 GUI 窗口导致任务中断
- 路径含空格必须用英文双引号包裹,比如
"C:\My Tasks\sync.ntx" - 首次运行建议加日志重定向:
navigator.exe --transfer task.ntx >> sync.log 2>&1,方便排查Failed to load connection类错误 - 报这个错?大概率是
.ntx里保存了密码;必须改回连接属性中填明文密码(仅限内网可信环境)
别用「截断目标表」,用「更新+插入」模式保业务连续性
默认「截断目标表」看似省事,但对线上表极其危险:它先 TRUNCATE 再全量插入,期间目标表为空,业务查询直接报错。更稳妥的是选「更新匹配记录 + 插入新记录」,前提是目标表有主键或唯一索引。
容易踩的坑:源库和目标库时间字段处理不当。比如源库 updated_at 是自动生成的,目标库却想保留本地最新值——这时必须在「字段映射」里取消该字段绑定,否则每次同步都会覆盖掉业务侧的真实更新时间。
- 勾选
删除目标表中不存在于源表的记录?谨慎!这相当于「以源为权威」,目标库手工加的测试数据会被清掉 - 大表(>100 万行)同步前,确认源库没开启
binlog_row_image = MINIMAL,否则某些 UPDATE 可能漏同步 - 跨时区同步时,检查两个连接的「时区设置」是否一致,否则
DATETIME字段会偏移











