navicat中结构同步与数据同步必须严格分离,禁用结构同步功能,仅通过“工具→数据同步”执行;同步前需人工核对表结构、关闭所有结构变更选项、手动配置字段映射与时区条件。

结构同步和数据同步必须分开操作
Navicat 没有“只同步数据、跳过结构”的一键开关。一旦误点「结构同步」,哪怕只改了一个字段,它也会生成并执行 ALTER TABLE 语句——包括可能覆盖 AUTO_INCREMENT、字符集、注释等你没想动的部分。真正安全的做法是:**完全不用结构同步功能,只走「工具 → 数据同步」流程**。
常见错误现象:点了「结构同步」后目标表还能查,但第二天 INSERT 报 Duplicate entry,根源就是 AUTO_INCREMENT 被强行设回了源表值;或者字段注释全丢、默认值被清空。
- 确认入口:必须用
工具 → 数据同步,不是工具 → 结构同步或工具 → 数据传输 - 结构差异提前人工核对:运行数据同步前,手动在两个库分别执行
SHOW CREATE TABLE table_name,比对 ENGINE、CHARSET、COLLATE、COMMENT 等关键项 - 如果结构已有差异(比如目标表多一个
is_archived TINYINT),数据同步时必须进「表映射 → Options → Ignore columns」里把该字段加进去,否则 Navicat 会试图写入 NULL 导致失败
数据同步中必须关闭所有结构变更相关选项
「数据同步」界面里藏着几个默认开启、但会偷偷改结构的勾选项,不关掉就等于开了后门。
- 在「选项」页签中,取消勾选「删除记录」:这个选项实际会触发
DROP TABLE+CREATE TABLE,不是删数据,是删整张表再重建 -
取消勾选「删除目标中不存在的记录」:名字有误导性,它本质是执行
DELETE FROM target WHERE id NOT IN (SELECT id FROM source),属于逻辑删,但依然会破坏目标表特有数据 - 「高级选项 → 冲突处理」选
skip,不是update existing records:后者会触发UPDATE ... SET,虽不改结构,但可能意外覆盖非新增字段
字段映射阶段要手动控制新增字段行为
结构不同步 ≠ 字段能自动忽略。Navicat 默认按字段名匹配,源表新加了 updated_by VARCHAR(32),目标表还没这列,同步就会直接报错中断。
- 进「表映射」→ 点目标表右侧
Options→ 勾选Ignore columns→ 手动添加所有目标表暂未存在的字段名 - 更稳妥做法:取消勾选
Match fields by name,然后逐个拖拽连线,确保created_at不被连到新字段上 - 如果新字段不允许为 NULL 且无默认值,必须先在目标表执行
ALTER TABLE table_name MODIFY updated_by VARCHAR(32) DEFAULT NULL,否则同步卡死
时间字段和时区不一致会导致 WHERE 条件失效
你以为加了 created_at > '2026-09-01 00:00:00' 就能精准拉增量?如果 Navicat 客户端时区是 CST,而源库是 UTC,那这条条件实际查的是 UTC 时间下的 2026-09-01 00:00:00,相当于漏掉 8 小时数据。
- 检查方式:在 Navicat 查询窗口执行
SELECT NOW(), @@time_zone, @@system_time_zone,对比源库和目标库结果 - WHERE 条件必须用带时区偏移的字符串,比如
created_at > '2026-09-01 00:00:00+00:00'(UTC)或created_at > '2026-09-01 08:00:00+08:00'(CST) - 别用
NOW()或DATE_SUB(NOW(), INTERVAL 1 DAY):Navicat GUI 不解析函数,只当字面量处理
SHOW CREATE TABLE 输出。











