Navicat 不支持自动化断点续传,其数据传输与同步为无状态一次性任务,无进度保存或位点追踪机制;需人工查最大id/时间戳加WHERE条件,或通过高级模式自定义记录集分段并脚本记录执行序号实现近似续传。
Navicat 本身不支持自动化断点续传
navicat 的数据传输(data transfer)和同步(data synchronization)都是无状态的一次性任务,不保存任何执行进度,也没有内置的位点(如 binlog position、scn 或 offset)追踪机制。所谓“续传”,全靠人工干预:你得自己查目标库最大 id、最新 create_time,再手动加 where 条件或跳过已同步表。自动化脚本调用 navicat 时,它只会原样执行配置,不会读取上次中断位置。
用高级模式 + 自定义记录集模拟断点逻辑
这是最接近“可脚本化续传”的做法,但前提是源表有可用主键或时间字段,且你愿意提前切片:
- 必须启用
高级模式→ 勾选自定义记录集→ 点击记录集生成器 - 选择按主键(如
id)范围自动分段,例如每 50,000 行一组,生成dataset_001、dataset_002等独立数据集 - 每个数据集对应一条独立 SQL 查询(如
WHERE id BETWEEN 1 AND 50000),失败后你只需在脚本中记录最后成功执行的序号(如006),下次从dataset_007开始 - 注意:
dataset_*名称是静态生成的,不随数据变化;若源表被删行或重写,序号和范围可能错位,需配合MAX(id)校验
脚本里怎么安全跳过已同步表?
跨库迁移(如 Oracle → MySQL)时,重复建表会直接报错 Table 'xxx' already exists。不能依赖 Navicat 自动识别,必须靠 SQL 预判:
- 先在目标库查已有表:
SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'target_db' - 再在源库反查缺失项:
SELECT table_name FROM all_tables WHERE owner = 'SRC_USER' AND table_name NOT IN ('t1','t2') - 把结果拼成逗号分隔列表,填入 Navicat 高级模式的
表过滤框中(注意大小写:Oracle 默认大写,MySQL 可能小写) - 别用 Profile 直接加载——Profile 不感知库结构变更,字段新增/删除后映射会错,每次都要进
表映射页手动核对Key Mapping
为什么不能靠“自动重连”实现续传?
自动重连 和 保持连接间隔 是两个常被混淆的选项,但它们都不等于续传:
-
保持连接间隔(设为 60 秒)+使用 Keep Alive:防中间设备(防火墙、SLB)断链,避免连接空闲超时 -
自动重连:仅在网络闪断后恢复连接,任务仍停在中断那一步,不会自动继续执行下一条记录或下一个数据集 - 云数据库(如阿里云 RDS)默认
wait_timeout=300,光设 Navicat 间隔不够,必须去控制台调大到1800才稳 - 真正需要的是:脚本层捕获 Navicat 进程退出码(如非 0)、解析日志末尾的
INSERT INTO t_xxx VALUES (...),提取最后id,再构造新 WHERE 条件重新触发
复杂点在于:Navicat 不暴露内部执行状态,所有“断点”都得靠外部手段补全——查目标库、记日志、管锁文件、校验主键。没有银弹,只有组合拳。别指望一个勾选项解决全部问题。











