Navicat备份卡在99%是mysqldump正处理大字段或BLOB数据,非界面假死;主因是max_allowed_packet过小、服务端超时断连或SSH隧道不稳定,需调参、分表导出或改用mysqldump/mydumper命令行直连。
Navicat备份卡在99%是mysqldump正在处理大字段或BLOB数据
不是界面假死,而是底层mysqldump在逐行读取含text、mediumtext、blob等大字段的表时,单次网络包或内存缓冲溢出,触发重试或阻塞。尤其当max_allowed_packet未调大、字段平均长度超1mb、且表行数多时,最后几条记录导出耗时远超预期。
实操建议:
- 先用
SELECT table_name, column_name, data_type FROM information_schema.COLUMNS WHERE table_schema = 'your_db' AND data_type IN ('text', 'blob', 'mediumtext', 'longtext') ORDER BY table_name;定位含大字段的表 - 对这些表单独导出:右键表 → Export Table Data → 勾选
Export to SQL file,并在高级选项中加--max-allowed-packet=512M - 若必须全库备份,在Navicat「Additional options」里强制传参:
--max-allowed-packet=512M --skip-extended-insert(后者避免单INSERT语句过长) - 禁用Navicat默认的「压缩备份文件」——压缩会延长大字段写入时间,且无法流式处理
Navicat备份停在99%也可能是网络连接被服务端主动断开
MySQL服务端配置了wait_timeout或interactive_timeout(默认通常为28800秒),但Navicat导出大表时,中间可能长时间无查询交互(尤其在写入阶段),服务端判定连接空闲后直接KILL掉该线程,而Navicat客户端仍在等待响应,表现为进度卡住、无报错、CPU/IO双低。
实操建议:
- 检查MySQL错误日志,搜索
Aborted connection或MySQL server has gone away,确认是否由超时引起 - 临时调高服务端参数:
SET GLOBAL wait_timeout = 86400;(仅当前会话生效,重启失效) - 在Navicat连接属性 → 「高级」页签中,勾选
Keep connection alive(部分版本支持),或手动加连接参数?connect_timeout=60&read_timeout=3600 - 更稳妥的做法:改用
mysqldump命令行直连,并加--net-read-timeout=3600 --net-write-timeout=3600
99%卡顿还常出现在跨公网/SSH隧道备份场景
Navicat通过GUI封装调用mysqldump时,若走SSH隧道,会额外引入一层进程通信和日志重定向。当隧道延迟高(>100ms)、丢包率略升(>0.5%),或本地ssh配置未启用ServerAliveInterval,mysqldump的stdout/stderr输出不连续,Navicat主进程因轮询超时而挂起,但子进程仍在后台跑——你看到的“99%”,其实是它没收到最后一段输出。
实操建议:
- 测试SSH隧道稳定性:
ssh -o ServerAliveInterval=30 -o ServerAliveCountMax=3 user@host "echo ok",持续运行5分钟看是否断连 - 在Navicat定时任务中,改用「运行外部程序」方式调用
mysqldump,并确保命令末尾有重定向:> /path/to/backup.sql 2>&1 - 禁用Navicat的「实时显示日志」选项(工具 → 选项 → 备份 → 取消勾选
Show log during backup),减少GUI与子进程间的状态同步压力 - 若必须走SSH,优先用
ProxyCommand配置跳板机,比Navicat内置SSH更稳定
为什么不用Navicat自带的「暂停/续传」功能?
因为Navicat所有GUI备份动作都不支持中断续传。所谓“99%”只是进度估算,底层mysqldump并未生成校验点或分块标记。一旦中断,整个备份文件即不可用——哪怕只差一行,还原时也会报Unknown command或SQL syntax error。这也是它卡在99%却不敢轻易取消的根本原因:取消 = 白跑。
真正可靠的方案是绕开GUI:
- 用
mysqldump --single-transaction --skip-triggers --no-create-info --tables db1 table1 > table1.sql按表拆分,失败只影响单表 - 对超大表,先
SELECT ... INTO OUTFILE导出CSV,再用LOAD DATA INFILE还原,速度更快、可控性更强 - 生产环境超过10GB的库,应放弃Navicat全量备份,转向
mydumper+myloader组合,支持并发、断点续传、自动分片











