Navicat Data Sync 默认不自动执行同步,需手动点击Run才写入目标库;差异预览仅为只读SQL展示,勾选Compare only或不点Run均无变更;导出SQL脚本需取消“立即执行”并勾选“保存到文件”。

Navicat 数据对比工具默认不自动执行同步
Navicat 的 Data Sync 功能在完成差异分析后,**不会自动写入目标库**——它必须手动点击 Run 或 Synchronize 才会真正执行 INSERT/UPDATE/DELETE。也就是说,只要你不点执行按钮,整个过程就是只读比对。
常见误操作是:看到“差异预览”界面就以为已修改,其实那只是渲染出来的 SQL 预览(SQL Preview 标签页),底层数据毫发无损。
- 启动路径:
Tools → Data Sync,选择源库和目标库后,点击Next - 在第三步“Select Synchronization Options”中,勾选
Compare only(该选项明确禁用所有写操作) - 即使未勾选
Compare only,只要停留在Preview页面、不点右下角的Run,就不会有任何变更
如何导出差异结果为可审查的 SQL 脚本而非直接运行
如果你需要把差异生成为人工审核用的 SQL 文件(比如给 DBA 过审或存档),关键在第二步“Synchronization Settings”里的导出控制:
- 取消勾选
Execute synchronization immediately - 勾选
Save synchronization script to file,指定路径后,点击Run—— 此时 Navicat 仅生成 SQL 文件,不连库执行 - 生成的脚本含标准注释,如
-- [INSERT] table_name (id=123),方便快速定位操作类型与主键 - 注意:该脚本默认不含事务包装(
BEGIN/COMMIT),如需原子性,得手动补全
为什么有时“Preview”里看不到差异,但实际数据不同?
这通常不是工具失效,而是比对逻辑的隐含前提没满足:
-
Data Sync默认以**主键或唯一索引列**作为匹配依据;若表无主键且无唯一索引,Navicat 会退化为全字段比对,但可能因 NULL 处理或字符集排序规则导致漏判 - 时间字段(
DATETIME/TIMESTAMP)若精度不一致(如源库存到微秒、目标库只到秒),会被视为不等 —— 建议提前用CAST(col AS DATE)或截断函数统一格式再比对 - 字符字段若涉及不同 collation(如
utf8mb4_0900_as_csvsutf8mb4_general_ci),大小写敏感性差异可能导致“相同值”被标为不同 - 确认是否勾选了
Ignore spaces和Ignore case—— 它们在“Advanced Settings”里,影响文本类字段比对结果
替代方案:用命令行或 SQL 实现轻量级只读比对
当 Navicat 界面操作受限(比如权限不足、无法连目标库写临时表),可改用 SQL 层比对:
例如 MySQL 下检查两表记录数+主键集合差异:
SELECT 'missing_in_target' as flag, id FROM source_table WHERE id NOT IN (SELECT id FROM target_table);
或用 UNION ALL + GROUP BY 找出仅存在于某一方的主键(需确保字段可比,NULL 要单独处理):
SELECT id FROM (SELECT id FROM source_table UNION ALL SELECT id FROM target_table) t GROUP BY id HAVING COUNT(*) = 1;
这类语句可直接在 Navicat 的查询窗口运行,零风险,且能精确控制比对维度。
真正容易被忽略的是:Navicat 的“对比快照”功能(Structure Sync 或 Data Sync 中的保存快照)一旦启用,后续比对会基于快照而非实时数据——如果忘了更新快照,你其实在跟过期状态较劲。


















