max_allowed_packet超限会报“Lost connection to MySQL server during query”或“Packets larger than max_allowed_packet are not allowed”;需服务端([mysqld]段)和客户端([client]段或命令行参数)同时配置,单位支持M/G,改后服务端须重启,客户端下次连接生效,验证以SHOW VARIABLES为准。

max_allowed_packet 超了会报什么错
客户端或服务端在处理大 SQL、大 BLOB、大导入文件时,一旦单个包超过限制,MySQL 直接断开连接,常见错误是:Lost connection to MySQL server during query 或 Packets larger than max_allowed_packet are not allowed。注意:这个错不总在客户端显示完整,有时只表现为查询无声失败、mysql 命令行突然退出、mysqldump 中断、ORM 报“connection lost”——先查这个参数再翻网络或权限。
怎么改 max_allowed_packet 才真正生效
这个值必须**服务端和客户端同时配**,否则一端卡住就白调。服务端改 my.cnf(Linux)或 my.ini(Windows)的 [mysqld] 段:
max_allowed_packet = 64M
客户端也要配,比如用 mysql 命令行时加参数:
mysql --max-allowed-packet=64M -u root -p
或者在 [client] 段统一写死:
[client] max_allowed_packet = 64M
改完必须重启 mysqld(服务端配置才加载),但客户端配置不用重启——只是下次连接才生效。
-
max_allowed_packet是动态变量,但SET GLOBAL只影响新连接,且重启后丢失,不推荐线上临时改 - 单位支持
K/M/G,别写成64*1024*1024这种硬数字,易错 - 如果用 Docker,记得把配置挂载进容器,并确认容器内
mysqld实际读的是哪个配置文件(mysqld --verbose --help | grep "Default options")
不同场景下该设多大
没有万能值,得看实际负载:
- 纯 ORM 写入小记录?
16M足够,没必要拉到1G - 用
mysqldump导出含长文本/JSON 的表?导出时加--max-allowed-packet=256M,否则可能 dump 到一半失败 - PHP 的
mysqli或PDO默认用客户端配置,如果 PHP-FPM 进程启动后才读配置,要重启 PHP 才能生效 - 云数据库(如阿里云 RDS、AWS RDS)通常不允许改
mysqld级配置,只能调客户端参数,或走控制台修改参数组(注意:部分厂商对max_allowed_packet有上限,比如 1G 封顶)
改完没效果?先检查这三件事
很多人改了配置还是报错,大概率栽在这几个地方:
- 改的是
[mysql]段(命令行客户端)而不是[mysqld](服务端),结果服务端根本没变 - MySQL 读了多个配置文件(
/etc/my.cnf、/etc/mysql/my.cnf、~/.my.cnf),后加载的覆盖前一个,用mysqld --verbose --help | grep "Default options"确认顺序 - 应用层(如 Python 的
PyMySQL)自己设了max_allowed_packet参数,优先级高于配置文件,得在代码里显式传参
最稳的验证方式:连上后执行 SHOW VARIABLES LIKE 'max_allowed_packet';,看返回值是不是你设的数——别信配置文件写了就算数。


















