需同时调大MySQL服务端和客户端的max_allowed_packet值,服务端可动态设置SET GLOBAL,客户端需显式指定参数,数值应根据导入文件最大行长度加20%余量确定,避免过大浪费内存。
MySQL 导入报 Got a packet bigger than 'max_allowed_packet' 怎么办
直接改配置,不改不行——这个错误不是数据有问题,是 mysql 服务端拒绝接收超过当前限制的单个网络包。默认值通常只有 4mb,一张大表或含长文本/二进制字段的 sql 文件很容易超。
max_allowed_packet 该设多大?看导入内容,不是越大越好
设太大可能浪费内存、拖慢连接初始化,还可能掩盖真正的问题(比如 SQL 文件里混了调试用的超大字符串)。关键是匹配你的实际导入需求:
- 纯结构 + 小数据:
16M足够 - 含
MEDIUMTEXT/BLOB字段的表:至少64M - 整库导出文件(
mysqldump生成):检查文件里最长的一行(通常是某条INSERT),用awk '{print length}' dump.sql | sort -nr | head -1看字节数,再加 20% 余量 - 线上服务慎设超过
256M,尤其内存紧张时
必须同时改客户端和服务端,只改一边没用
很多人只改了 my.cnf 里的服务端配置,但 mysql 命令行客户端也有自己的 max_allowed_packet 默认值(通常更小),导入时它先打包再发给服务端,自己卡住就根本到不了服务端。
- 服务端生效需重启或动态设置:
SET GLOBAL max_allowed_packet = 134217728;(单位字节,即 128M) - 客户端要显式指定:
mysql --max_allowed_packet=128M -u root -p - 如果用
source命令在 mysql shell 里执行,得提前在 shell 里运行:set session max_allowed_packet = 134217728; - 配置文件写法:
[mysqld]和[mysql]段都要加max_allowed_packet = 128M
遇到 ERROR 1153 (08S01) 或导入中途断连,大概率是没生效
这个错误码常和包大小有关,但不一定就是 max_allowed_packet 没调对——也可能是网络中间件(如代理、防火墙)截断了大包,或者客户端连接被服务端 timeout 中断后重连,新连接又用了旧的小包限制。
- 确认生效:连上 MySQL 后执行
SHOW VARIABLES LIKE 'max_allowed_packet';,分别查GLOBAL和SESSION值 - 避免代理干扰:直连 MySQL,绕过 HAProxy / MySQL Router 等中间层测试一次
- 导大文件别用 phpMyAdmin 或某些 GUI 工具,它们自身有上传限制和内存限制,优先用命令行
- 如果用
mysqldump导出,记得加--max-allowed-packet=128M,否则导出的 SQL 可能包含超长语句,导入时照样失败











