Navicat同步中断主因是MySQL服务端主动断链,非网络问题;需在Navicat中启用Keep-Alive并设间隔为2400秒,同时调大MySQL的wait_timeout至28800秒及max_allowed_packet至512M,并检查SQL mode与外键设置。
这个问题基本不是网络断了,而是 mysql 主动把连接关了——尤其在同步大表、含 blob/longtext 字段、或空闲等待时间稍长时。
为什么同步中途会断连
Navicat 数据同步本质是批量执行 INSERT(或 REPLACE/INSERT IGNORE),一旦某条语句执行时间超过 wait_timeout,MySQL 就会直接 kill 连接。注意:interactive_timeout 对 Navicat 不生效(它不走交互式协议),真正起作用的是 wait_timeout;而默认 28800 秒(8 小时)在高负载下可能被动态缩短,实际有效值常远低于此。
常见诱因包括:
- 目标表有大字段(如
LONGTEXT),单行 INSERT 解析+写入耗时超限 - 同步过程中无任何语句执行的“空闲间隙”触发超时(比如 Navicat 内部批处理间隔)
-
max_allowed_packet不足,导致某条 INSERT 被截断,后续通信异常 - MySQL 错误日志里出现
Aborted_clients上升,基本可锁定是服务端主动断连
Navicat 客户端侧必须调的两个参数
仅改 MySQL 配置不够,Navicat 自身的保活机制必须启用,否则它不会主动发心跳包。
操作路径:选中连接 → 右键「编辑连接」→「高级」选项卡
- 勾选「保持连接」(Keep-Alive)
- 「保持连接间隔(秒)」设为
2400(即 40 分钟),不要设太小(如 10 秒),否则可能引发服务端连接数暴涨 - 「连接超时(秒)」建议设为
60,避免初始握手失败被误判
MySQL 服务端关键参数调整
修改 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf 的 [mysqld] 段:
[mysqld] wait_timeout = 28800 interactive_timeout = 28800 max_allowed_packet = 512M
改完必须重启 MySQL(sudo systemctl restart mysql),仅用 SET GLOBAL 临时生效不可靠——Navicat 建连时读的是启动时加载的值。
验证是否生效:
mysql -u root -p -e "SELECT @@wait_timeout, @@max_allowed_packet;"
同步前务必检查的三个细节
很多断连其实在同步启动前就埋了雷:
- 确认目标库 SQL mode 不含
STRICT_TRANS_TABLES(尤其 MySQL 8.0+),否则空值插入TIMESTAMP字段会静默失败并中断连接,日志只报 warning - Navicat 同步向导「高级」页里,勾选「设置时间戳字段为 CURRENT_TIMESTAMP」——避免传 NULL 触发校验失败
- 若同步含外键的大表,先在 Navicat 执行
SET FOREIGN_KEY_CHECKS=0;(通过「运行 SQL 文件」功能),同步完成再设回 1,否则外键约束可能拖慢单条 INSERT 致超时
真正麻烦的不是参数本身,而是这些配置项分布在 Navicat GUI、MySQL 配置文件、SQL mode、甚至表结构定义里——漏掉任意一环,都可能让同步在第 1278 行突然断开,且错误提示完全不指向真实原因。


















