keepaliveinterval必须小于wait_timeout的一半:先查select @@wait_timeout,若为300则keepaliveinterval最大设149(推荐120),若为600则上限300(稳妥选240),且必须勾选keepalive、取消“仅当有查询时发送ping”。

KeepaliveInterval 必须小于 wait_timeout 的一半
空闲断连不是 Navicat “掉线”,而是服务端(如 MySQL)在 wait_timeout 时间后主动 kill 连接,防火墙/NAT 设备只是顺手回收了已失效的 socket。你看到的“连接已关闭”或“MySQL server has gone away”基本都源于此。
先执行:SELECT @@wait_timeout; 查清服务端值——云数据库常设为 300 或 600 秒,本地环境可能是 28800。然后在 Navicat 连接 → Advanced 页中设置:KeepaliveInterval 必须严格小于该值的 0.5 倍:
- 若
@@wait_timeout = 300,KeepaliveInterval最大只能设 149,推荐 120 - 若
@@wait_timeout = 600,别填 600,填 300 是上限,稳妥选 240 -
Keepalive开关必须勾选,否则不发 TCP 层心跳,KeepaliveInterval形同虚设 - 取消勾选「仅当有查询时发送 ping」,否则空闲期间完全沉默,等于没开 keepalive
Linux 版 Navicat 没有 Connection Timeout 滑块,别找
Linux 桌面版(如 Navicat Premium 17.x)的 GUI 精简掉了“连接超时”滑块,因为这个参数实际由系统 socket 层控制,Navicat 不暴露也不允许修改。你真正能调、也真正起作用的只有三个字段:Keepalive、KeepaliveInterval、Auto-reconnect。
注意:Connection Timeout(建连阶段超时)和 Socket Timeout(SQL 执行等待)是两个独立参数,它们不影响空闲保活——只影响“连不上”或“卡死在某条语句”。防防火墙切断,只靠 keepalive 机制。
域名解析慢会导致首次连接卡住,绕过它
Linux 版 Navicat 不继承系统 DNS 缓存或代理配置。如果数据库地址是域名(如 db-prod.internal),而 /etc/resolv.conf 中 DNS 响应延迟高,首次连接就会在解析阶段卡住并超时,表现为“连接超时”,但 ping 和 telnet 都正常。
解决方法很简单:
- 在 Navicat 连接配置中,直接填数据库服务器 IP 地址,不要用域名
- 如必须用域名,确保
/etc/resolv.conf指向低延迟 DNS(如 114.114.114.114 或 8.8.8.8) - 检查是否启用
systemd-resolved并干扰了超时行为(常见于 Ubuntu 22.04+)
防火墙规则要单独配 navicatcmd.exe,不是 navicat.exe
如果你用的是计划任务自动执行备份/同步,且任务状态显示“已运行”但无实际动作,大概率是 Windows 防火墙拦截了 navicatcmd.exe 的出站连接——它以服务会话方式启动,不受用户级防火墙规则保护。
必须手动添加出站规则:
- 打开
wf.msc→ 出站规则 → 新建规则 → 类型选「程序」 - 路径必须是绝对路径,例如:
C:\Program Files\PremiumSoft\Navicat Premium 16\navicatcmd.exe - 操作选「允许连接」,配置文件全勾(域、专用、公用)
- 规则名建议写清楚,如
NavicatCMD-Outbound
Navicat 主程序 navicat.exe 的规则对计划任务完全无效。











