navicat 15 数据同步默认非增量,因其无自动记录同步位点机制,必须手动配置where过滤条件(如update_time > ?或id > ?)实现增量;它基于全量快照比对,不保存上次值,也不自动反查目标表最大id,且仅premium版支持定时任务调度。

Navicat 15 本身不支持原生的「按时间戳/自增ID自动识别增量」逻辑,它默认做的是全量比对同步;真要实现可靠增量,必须手动控制条件、规避结构变更风险,并确认版本权限是否支持自动化调度。
为什么“数据同步”功能默认不是增量的
Navicat 的「数据同步」工具本质是逐行比对源表与目标表的**当前快照**(基于主键或唯一键),再生成 INSERT/UPDATE/DELETE 语句。它没有内置的“上次同步点”记录机制,也不会自动记住 update_time > '2024-09-01 00:00:00' 这类条件——除非你主动在「高级选项」里加过滤规则。
- 如果你没设 WHERE 条件,它会对比整张表,哪怕只新增 1 行,也会扫描全部百万级记录
- 即使勾选了「跳过具有相同数据的记录」,仍需先读取目标表全量主键用于比对,IO 和内存开销不小
- 一旦源表结构新增字段,而目标表未同步,同步过程可能因列数不匹配直接失败,报错类似
Column count doesn't match value count
如何用“过滤条件”模拟增量行为
在「数据同步」向导的「选项」→「高级」页中,启用「使用自定义过滤器」,填入确定性、单调递增的字段条件。这是最轻量且可控的方式。
- 优先用业务时间字段:如
WHERE update_time > ?,但必须确保该字段严格由应用写入、无回填、时区统一(推荐存 UTC) - 次选用自增主键:
WHERE id > ?,适用于只追加、不删不改的日志类表;注意 MySQL 的REPLACE INTO或INSERT IGNORE不在此流程内,Navicat 不走这个路径 - 参数
?需每次手动更新——Navicat 不保存上一次的值,也不能从目标表反查最大值自动填充 - 避免用
created_at BETWEEN ? AND ?:窗口重叠或漏掉延迟写入的数据极难排查
Premium 版本才能跑定时任务,否则得靠命令行
只有 Navicat Premium 15(非 Standard/Essentials)在有效授权下,才允许把「数据同步」任务保存为 .ncx 并加入内置「计划」模块。其他版本必须走外部调度。
- 保存任务后,在 Windows 上用
navicat.exe --sync "C:\tasks\sync_orders.ncx"调用,但首次运行会弹 GUI 窗口 - 务必提前在同步设置 → 高级 → 勾选「隐藏进度窗口」,否则后台执行会卡死
- macOS 路径含空格时,
--sync参数必须用双引号包裹,例如:"/Applications/Navicat Premium.app/Contents/MacOS/navicat" --sync "/Users/me/sync.ncx" - 日志建议重定向:
navicat.exe --sync task.ncx >> sync.log 2>&1,否则失败无声无息
结构不一致时,增量同步会静默失败
Navicat 的数据同步不会校验字段类型或长度差异。如果测试库给 user.name 加了 VARCHAR(200),而生产库还是 VARCHAR(50),同步时可能截断、报错甚至跳过整行——错误日志里只显示 data too long for column 'name',不会提示是结构不同步导致的。
- 每次执行增量同步前,应先跑一次「结构同步」,但只勾选新增字段、索引,**绝对不要勾选 DROP COLUMN 或 MODIFY COLUMN**
- 检查目标表是否有唯一约束:没有
UNIQUE KEY或PRIMARY KEY,Navicat 就无法判断哪条是“新”、哪条是“旧”,增量逻辑退化为全量 - 若表含外键,同步前确认父表数据已就位,否则会卡在
Cannot add or update a child row,且 Navicat 不提示缺失哪条父记录
真正可靠的增量,不是靠工具按钮点出来的,而是靠字段设计(单调、可排序)、权限控制(Premium 才有计划)、以及每次同步前那三秒的手动核对:确认过滤条件、确认结构一致、确认外键完整。少一个,都可能让凌晨三点的日志告警变成线上事故。











