Navicat还原不支持断点续传,因其串行执行SQL流且不记录执行位点;中断后无法自动恢复,重跑将导致重复插入或覆盖,唯一可行方式是前置分段导出SQL并依日志定位断点手动续传。

Navicat 还原过程不支持断点续传——无论你用的是「还原备份」还是「导入 SQL 文件」,一旦网络或连接中断,任务就彻底停止,已写入的数据不会自动回滚,但后续无法从中断处继续;重跑会重复插入、触发 ERROR 1062 或覆盖已有数据。
为什么还原操作没有断点续传能力
Navicat 的还原(Restore)本质是串行执行 SQL 语句流,不记录执行位点,也不解析事务边界。它不像同步任务那样能切片或比对主键,更不监听 binlog/WAL。中断后,工具完全不知道“最后一条成功执行的 INSERT 是哪一行”。
- 还原 SQL 文件时,Navicat 把整个文件当文本流读取并逐条发送,无语义解析,无法跳过已执行部分
- 还原 .ncb 备份文件时,解压+导入是原子流程,中途失败即整体失败,无中间状态保存
- 即使开了「自动重连」和「保持连接间隔」,也只恢复连接,不恢复执行进度
还原中断后怎么手动续传
唯一可行路径是:提前拆分 SQL、控制执行粒度、靠日志定位断点。这不是 Navicat 提供的功能,而是你必须做的前置动作。
- 用
mysqldump --skip-triggers --no-create-info --where="id > 100000"等方式导出带条件的分段 SQL,还原前按范围分多个文件 - 还原时勾选「继续导入其余记录」+「跳过错误的记录」,但注意:
Skip duplicate key errors仅在 Navicat 15+ 的「选项 → 错误处理」页生效,且只对 INSERT 生效 - 中断后立即导出完整日志(右键 → 导出日志),搜索最后一句成功的
INSERT INTO,提取其主键值,作为下一段 WHERE 条件起点 - 若用的是大 SQL 文件,建议先用
split -l 5000 big.sql part_拆成小文件,再逐个还原,失败只重跑单个片段
哪些设置看似有用实则无效
很多人误以为以下配置能“让还原自动续上”,其实它们对还原流程完全不起作用:
- 「自定义记录集」:只用于「数据同步」任务,还原界面压根不出现该选项
- 「保持连接间隔」设为 60:防服务器踢连接,但不影响还原逻辑本身
- 「Reconnect when connection is lost」开启:连接恢复后,任务卡在中断那步,必须手动点「继续」——而还原界面没有「继续」按钮,只能重来
- 「Continue on error」勾选:它会让 Navicat 忽略某些语法错误继续执行,但遇到网络中断或连接丢失,直接终止,不进入错误处理分支
真正麻烦的是:还原中断后,你既不能信任界面显示的最后一行,也不能靠肉眼滚动找断点——ERROR 2013 (HY000): Lost connection to MySQL server during query 出现时,最后几条成功语句往往已被日志缓冲区吞掉。不导出完整日志,90% 的人会续错位置,导致漏数据或主键冲突。











