mysqldump -uroot -p --extended-insert=false olddb > old.sql split -l 200000 old.sql part_ for f in part_*; do mysql -uroot -p newdb < $f; done
整站导出的 SQL 有 2.1GB 用面板上传导入走到一半报 502 换命令行重试又提示 max_allowed_packet 超过限制 两次都卡在同一张表。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,单条 INSERT 被 mysqldump 拼成几十兆 超过服务端 max_allowed_packet 默认的 64M 连接直接被断开 前半段写进去了后半段全丢 面板那头看到的就是 502 重复试也一样。
围绕「导入包过大」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。
接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。
处理上按这个顺序:用 mysqldump 导出时加上 --extended-insert=false 让每条 INSERT 只带一行数据 别拼成巨长语句;服务端和客户端都把 max_allowed_packet 调到 256M 两边数值尽量保持一致;用 split 按行切分成多个小文件分批导入 别指望一次灌完两个 G。
改完只确认一件事:导入不再中途断开 完成后逐张表对比行数和旧库完全一致。
