navicat 17的“并行传输”仅在单次迁移任务内对多表分片并发读写,不支持跨任务并行;需手动禁用索引与外键、同构迁移才生效,且受限于i/o与锁表等因素。

Navicat 17 的“并行传输”只作用于单次数据迁移任务内部
所谓“启用并行传输(4线程)”,是指在**同一个数据传输任务中**,对选中的多个表进行分片并发读写——不是同时跑多个任务,也不是跨数据库并行。它不改变 Navicat 自身的调度逻辑,也不影响批处理作业或定时任务的执行顺序。
常见错误现象:工具 → 数据传输里勾了“启用并行传输”,但总耗时和串行没差别。原因通常是:源库锁表、目标库 I/O 瓶颈、网络带宽饱和,或表之间存在外键依赖导致实际仍被串行化执行。
- 仅对 MySQL → MySQL、PostgreSQL → PostgreSQL 等同构迁移生效;异构迁移(如 MySQL → PostgreSQL)中部分线程可能退化为单线程
- 并行线程数上限由“高级选项 → 并行传输”数值决定,默认是 2,最大建议设为 CPU 核心数 × 1.5,超过反而因上下文切换拖慢整体
- 该设置对“结构 + 数据”全量迁移最有效;若只传结构,或只传少量小表,并行收益几乎为零
必须手动关闭索引与外键才能释放并行吞吐潜力
即使开了 4 线程,并行写入仍会被索引更新和外键检查卡住。Navicat 不会自动帮你删索引——它只是把 INSERT 分批发过去,每批仍要走完整约束校验流程。
实操建议:
- 导出前,在源库用
SHOW CREATE TABLE记下所有PRIMARY KEY和INDEX语句 - 导入前,在目标库手动执行:
SET FOREIGN_KEY_CHECKS = 0;+ALTER TABLE t DROP PRIMARY KEY;+ALTER TABLE t DROP INDEX idx_name; - 在 Navicat 数据传输向导的“高级”页中,确认勾选“删除并重建目标表”(避免主键冲突阻塞并行流)
- 传输完成后立即执行之前记下的
CREATE INDEX和ALTER TABLE ... ADD PRIMARY KEY,别等后续操作
多库并行迁移不能靠 Navicat 批处理作业实现
新建批处理作业 添加 5 个数据库迁移任务?它们仍是严格串行:db1 完成 → db2 启动 → … → db5 结束。日志里看到的时间戳间隔,是排队等待时间,不是并发窗口。
真正提速的方法只有绕开 Navicat 调度层:
- Linux 下写 shell 脚本,每个
mysqldump或pg_dump命令后加&,末尾用wait等待全部结束 - Windows 下用 PowerShell:
Start-ThreadJob -ScriptBlock { & mysqldump ... } -ThrottleLimit 4 - 为每个库单独配置系统级定时任务(
crontab或 Windows 任务计划程序),触发时间完全一致
注意:并行数不是越多越好。机械硬盘、NFS 存储或低配云服务器上,并行超 3–4 个 dump 进程常导致 I/O wait 暴涨,总耗时反升。
Navicat Premium 版本不提供跨任务并行能力
升级到 Premium ≠ 获得多任务并行引擎。“支持更多数据库类型”“跨连接脚本”“细粒度日志”是它的真实增值点,和“同时跑多个备份/迁移任务”无关。
容易被忽略的关键点:
- 所有 Navicat 版本(含 Premium)底层调用的仍是
mysqldump、pg_dump这类单线程 CLI 工具,它们自身不支持对单库内多表并行导出 - 所谓“并行传输”是 Navicat 在应用层做的连接复用与批量分发,不是操作系统级的多进程调度
- 如果你观察到多个任务“看起来同时在跑”,大概率是它们各自处于不同阶段(比如一个在连 SSH,一个在读表元数据,一个在写磁盘),并非共享资源并发执行











