navicat 不支持真正增量备份,其“增量备份”实为手动 where 条件导出;一致性检查依赖 data sync 的条件比对,而非备份文件校验,因备份无位点、无元信息、不记录状态。
navicat 本身不支持增量备份,所谓“增量备份还原后的一致性检查”,实际是检查「全量还原 + 手动增量同步」两步操作后的结果是否准确——核心靠 data sync 的 where 过滤比对,而非备份文件校验。
为什么不能直接验证“增量备份文件”?
Navicat 的「备份数据库」功能永远是全量 SQL 导出,它不生成 binlog 差异、不记录位点、也不保存上次备份状态。你看到的“增量备份”选项,本质是用户自己用 Data Transfer 或 Data Sync 加了 WHERE 条件导出的数据包,不是 Navicat 自动识别变更的结果。
- 备份文件里没有元信息说明“这是从哪个时间点/位置开始的增量”,无法自动定位比对基准
- 如果你用
mysqldump --where="created_at > '2024-06-01'导出,那这个条件是否覆盖所有新增行,完全取决于业务写入逻辑,Navicat 不做校验 - 一旦源库在导出期间有延迟写入、事务未提交、或时区转换错误,
WHERE就会漏数据,而 Navicat 不报错也不预警
用 Data Sync 做增量还原后一致性检查的实操要点
这是最贴近真实场景、可立即落地的方式:把“增量同步目标库”当作待验证库,与原始源库做带条件比对。
- 必须手动打开每张表的
Options → Use WHERE condition,填入和当初增量导出**完全一致的条件**,例如id > 10000 AND created_at >= '2024-06-01 00:00:00' - 勾选
Match fields by name前,先确认两边表字段名是否真的一致;若目标库多了sync_time或少了deleted_at,得进映射界面手动拖拽,否则比对会跳过整列 -
Ignore columns必须包含目标库中你不希望被覆盖的字段,比如updated_at、version—— 否则同步过程会把源库旧值写回去,导致“看起来同步成功,实际数据倒退” - 比对前右键目标库 →
刷新,避免 Navicat 缓存旧元数据,把刚导入的增量行当“不存在”
大表或高风险场景下,绕过 Navicat 直接查差异更可靠
当单表超 50 万行,或 Data Sync 界面卡死、提示内存不足时,别硬等,用 SQL 直查差异:
- 在目标库执行:
SELECT id, created_at FROM target_table WHERE id > 10000 AND created_at >= '2024-06-01' AND id NOT IN (SELECT id FROM source_table WHERE id > 10000 AND created_at >= '2024-06-01'); - 注意:如果
id不是全局唯一(比如分表后 ID 重复),必须换用(id, created_at)联合判断,或加MD5(CONCAT(...))校验整行内容 - 时间字段务必统一时区处理,例如源库用 UTC 写入,目标库是 CST,就得把条件写成
created_at >= CONVERT_TZ('2024-06-01 00:00:00', '+00:00', '+08:00') - 避免用
NOT EXISTS套子查询查百万级数据,容易慢到超时;优先建好(id, created_at)复合索引
真正容易被忽略的,是增量依据字段本身的可靠性——created_at 允许 NULL、id 被归档重用、updated_at 被定时任务批量更新,都会让 WHERE 条件失效。比对前,先花两分钟确认这个字段在业务侧是否真的“只增不改”。











