需同时调大客户端和服务器端 max_allowed_packet 值,推荐客户端用 --max-allowed-packet=128M 参数,服务器端设为 64M 或 128M 并重启生效,云数据库需通过控制台或工单调整。
MySQL 导出报错 Got a packet bigger than 'max_allowed_packet' bytes 怎么办
导出大表或含长文本字段(如 text、mediumtext)时,mysqldump 默认用客户端和服务器两端的 max_allowed_packet 限制做校验。只要某一行数据(比如一个超长 json 字段)打包后超过该值,就会中断并报这个错——不是导出文件大小问题,是单个网络包长度超限。
- 必须同时调大客户端(
mysqldump进程)和服务器端(mysqld)的max_allowed_packet,只改一端无效 - 服务器端设置影响所有连接,建议设为
64M或128M;客户端可临时指定,不污染全局配置 - 修改
my.cnf后需重启mysqld才生效;mysqldump的参数优先级更高,可覆盖配置文件值
mysqldump 命令里怎么传 max_allowed_packet
直接加 --max-allowed-packet=128M 参数,单位支持 K/M/G,注意等号不能省,也不能写成 --max_allowed_packet(下划线会报错)。
- 该参数只作用于当前
mysqldump进程,不影响服务器或其他客户端 - 值必须 ≤ 服务器端配置的
max_allowed_packet,否则连接时被拒绝 - 推荐写法:
mysqldump --max-allowed-packet=128M -u root -p db_name table_name > dump.sql - 如果导出整个库仍失败,说明某些表单行数据 >128M,此时要先查出最大字段长度:
SELECT TABLE_NAME, COLUMN_NAME, CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE DATA_TYPE IN ('text','mediumtext','longtext') AND TABLE_SCHEMA='db_name' ORDER BY CHARACTER_MAXIMUM_LENGTH DESC LIMIT 5;
服务器端 max_allowed_packet 改多少才安全
不能盲目设成 1G。过大会增加内存压力,尤其在高并发场景下,每个连接都可能占用对应缓冲区;太小又反复报错。实际取值要看业务中最大单字段内容长度 + 约 20% 冗余。
- 线上环境建议从
64M起步,观察SHOW VARIABLES LIKE 'max_allowed_packet';和慢日志里是否还有相关错误 - 若使用云数据库(如阿里云 RDS、腾讯云 CDB),该参数通常不可直接修改,得走控制台「参数模板」或提工单调整
- MySQL 8.0+ 默认值是
64M,5.7 是4M,老版本升级后务必检查,否则导出旧库大概率失败 - 改完记得验证:
mysql -u root -p -e "SHOW VARIABLES LIKE 'max_allowed_packet';",确认输出值已更新
导出后 SQL 文件里出现乱码或截断,是不是 max_allowed_packet 没配对
不一定。乱码多因字符集不一致,截断更可能是字段本身被服务端强制截短(例如 SET sql_mode='STRICT_TRANS_TABLES' 下插入超长 VARCHAR 会报错,但导出时若没开严格模式,可能静默截断)。
-
max_allowed_packet不足只会导致导出中断并报错,不会静默截断内容 - 检查导出命令是否带
--default-character-set=utf8mb4,且数据库/表/列的CHARACTER SET确实是utf8mb4 - 用
head -n 20 dump.sql | grep -i charset看导出文件头部是否有正确的SET NAMES声明 - 真正要防截断,得在导出前确认源表字段定义:
SHOW CREATE TABLE table_name;,比对max_allowed_packet和最长可能内容长度

















