直接执行SELECT @@global.max_allowed_packet, @@session.max_allowed_packet;可同时查看全局与会话级值,避免仅用SHOW VARIABLES LIKE '%max_allowed_packet%'导致误判;XAMPP需在C:\xampp\mysql\bin\my.ini的[mysqld]、[client]、[mysqldump]三处均设置max_allowed_packet = 64M并彻底重启MySQL服务。

怎么查当前max_allowed_packet值
直接连进 MySQL 命令行,执行:SELECT @@global.max_allowed_packet, @@session.max_allowed_packet;
别只看 SHOW VARIABLES LIKE '%max_allowed_packet%'——它只显示会话级值,容易误判。两个值都要对得上:如果 @@global 是 4194304(4MB),但 @@session 是 1048576(1MB),说明客户端启动时被压低了,光改服务端没用。
Windows 下 XAMPP 的 my.ini 改哪几处
XAMPP 的 MySQL 配置文件是 C:\xampp\mysql\bin\my.ini(不是 etc 目录下的)。必须同时改两段:
-
[mysqld]段加:max_allowed_packet = 64M(这是服务端硬上限) -
[client]段加:max_allowed_packet = 64M(否则mysql命令行、Navicat、SQLyog 等工具仍按默认 16MB 走) - 别漏掉
[mysqldump]段(如果要用mysqldump导出大库):max_allowed_packet = 64M
改完保存,**必须重启 XAMPP 控制面板里的 MySQL 服务**,仅“停止再启动”不够,要确保进程完全退出再拉起。
用 mysql 命令行导入大 SQL 文件还报错?
即使 my.ini 改对了、服务也重启了,mysql -u root -p db_name 仍可能失败。因为命令行客户端有自己的缓冲区,默认不读 <code>[client] 段(尤其新版 XAMPP 自带的 MySQL 客户端)。解决方法只有两个:
- 显式传参:
mysql --max-allowed-packet=64M -u root -p db_name - 或改用交互式导入:先
mysql -u root -p进去,再执行SET SESSION max_allowed_packet = 67108864;,然后source dump.sql
注意:SET GLOBAL 对已建立连接无效,且 XAMPP 默认权限下普通用户执行会报 Access denied。
设成多大才不翻车
别一上来就写 1G。XAMPP 通常跑在开发机上,内存有限,设太大容易触发 OOM 杀进程。实际建议:
- 纯文本 SQL 导入(如 Confluence dump):32M~64M 足够
- 含 Base64 图片字段的 INSERT:按最长单条记录预估 + 20%,比如最长一条 12MB,设 16M 即可
- 值必须是 1024 的整数倍,单位后缀(
M/G)要大写,64m会被忽略 - 改完立刻验证:
SELECT @@global.max_allowed_packet;看是否真加载成功,别信配置文件写了就生效
最常被忽略的一点:某些 PHP 应用(比如旧版 WordPress 插件或自定义脚本)会在 PDO 连接串里硬编码 maxAllowedPacket,这时服务端调再大也没用——得去代码里搜 maxAllowedPacket 或 mysqli_options。


















