根本原因是max_allowed_packet、wait_timeout和客户端缓冲行为不匹配导致静默断连;须调大max_allowed_packet至512mb、wait_timeout至28800秒,并写入my.cnf重启生效。

MySQL 8.0 导入大型 SQL 脚本时连接中断,根本原因不是“网络不稳”,而是客户端与服务端在长事务、大包、超时、字符集等环节的默认策略不匹配——尤其是 max_allowed_packet、wait_timeout 和客户端驱动的缓冲行为三者叠加导致的静默断连。
导入前必须调大的两个关键参数
MySQL 8.0 默认的 max_allowed_packet 是 4MB,而一个含百万级 INSERT 的 SQL 文件(尤其带 BLOB 或长 JSON)很容易单条语句就超限。一旦超限,服务端直接关闭连接,客户端往往只报 “Lost connection to MySQL server during query” 或干脆卡住无响应。
-
SET GLOBAL max_allowed_packet = 512*1024*1024;(即 512MB),注意:该值不能超过服务端内存承受能力,且需在导入前执行 -
SET GLOBAL wait_timeout = 28800;(8 小时),避免空闲等待被杀;若脚本本身执行时间长,还需同步调大interactive_timeout - 这两个参数必须写进
my.cnf的[mysqld]段并重启,否则SET GLOBAL在服务重启后失效
mysql 客户端命令行导入的避坑写法
直接用 mysql -u root -p 是最常见但最危险的方式:它把整个文件一次性读入内存再发给服务端,遇到注释、空行、超长行极易触发解析失败或缓冲溢出。
- 改用
source命令,在已登录会话中执行:mysql> USE your_db;<br>mysql> source /path/to/huge.sql;
——它按行/语句粒度解析,更可控 - 务必加
--force参数启动客户端:mysql --force -u root -p,否则遇到某条语句报错(如重复主键),整个导入就终止 - 禁用自动提交:
mysql --init-command="SET autocommit=0" -u root -p,配合脚本内显式COMMIT,可减少锁持有时间和日志刷盘压力
Java 应用里用 JDBC 执行大脚本的陷阱
很多人把大 SQL 读成字符串再用 Statement.execute(),这等于把全部内容塞进单次网络包——8.0 驱动默认会拒绝 > max_allowed_packet 的请求,且不提示具体哪一行出问题。
- 不要用
execute(String),改用executeBatch()分块:每 1000 条 INSERT 组成一个 batch,显式addBatch()+executeBatch() - 连接串必须加
allowMultiQueries=true(仅当脚本含多语句分号分隔时需要),但注意该参数会禁用预编译,慎用于生产 - 如果脚本含
CREATE TABLE等 DDL,确保每条 DDL 单独执行,DDL 无法 batch,且会隐式提交事务 - 驱动版本必须 ≥ 8.0.23,旧版对大 packet 的流式处理有 bug,容易在中间阶段抛
ArrayIndexOutOfBoundsException
字符集与行结束符引发的隐形中断
Windows 编辑器保存的 SQL 文件默认是 CRLF(\r\n),而 Linux 下 mysql 客户端对换行敏感;同时,若文件声明了 utf8mb4 但实际含未转义的 emoji 或四字节字符,8.0 服务端会在解析中途丢弃连接,错误日志里却只留一句 “Aborted connection”。
- 用
file -i huge.sql确认编码,用dos2unix huge.sql统一换行符 - 导入前执行
SET NAMES utf8mb4;,并在my.cnf中补全:[client]<br>default-character-set = utf8mb4<br>[mysqld]<br>character-set-server = utf8mb4<br>collation-server = utf8mb4_unicode_ci
- 若脚本来自 mysqldump,务必加
--skip-extended-insert参数重导——它把每行 INSERT 拆成独立语句,便于定位失败点,也降低单语句长度
真正麻烦的不是参数调大,而是中断发生时你根本不知道停在哪一行。建议先导出小片段验证流程,再用 split -l 5000 huge.sql chunk_ 拆分后逐块导入,并记录每块的执行耗时和错误状态——这是线上批量迁移最稳妥的节奏。











