单改MySQL的max_allowed_packet不够,因phpMyAdmin导入需经PHP层,upload_max_filesize、post_max_size、memory_limit和max_execution_time未同步调大时,请求会在抵达MySQL前被PHP截断或中断。

直接改 my.ini 里的 max_allowed_packet 是最有效解法,但只改它大概率还是失败——必须同步调大 PHP 层的上传与执行限制。
为什么单改 MySQL 的 max_allowed_packet 不够
错误提示 “MySQL server has gone away” 看似是数据库断了,实际常是请求根本没发全就卡在半路。MySQL 拒收超限包时会直接关闭连接,但前提是包真到了它手里。而 XAMPP 下,phpMyAdmin 导入 SQL 文件要先经过 PHP:
- PHP 的
upload_max_filesize卡住文件上传(比如你选了 200MB 的 SQL,但 PHP 只允许传 2MB) -
post_max_size在表单提交阶段截断数据(即使文件传上来了,POST body 超限也会被 PHP 丢弃) -
memory_limit或max_execution_time让脚本中途退出,导致 MySQL 连接空闲超时
也就是说,MySQL 还没看到数据,PHP 就已经把它“放弃”了。
必须同步修改的三个位置
查完当前值再动手,别猜:
- 进 phpMyAdmin → SQL 标签页 → 执行:
SHOW VARIABLES LIKE 'max_allowed_packet'; - 打开
php.ini(XAMPP 默认路径:C:\xampp\php\php.ini),搜这四行:upload_max_filesize、post_max_size、memory_limit、max_execution_time - 确认
my.ini在C:\xampp\mysql\bin\my.ini,且修改的是[mysqld]段下的参数
推荐最小安全值(导入 100MB+ SQL 时):
-
my.ini中[mysqld]下加:max_allowed_packet = 256M -
php.ini中设:upload_max_filesize = 256M、post_max_size = 256M、memory_limit = 512M、max_execution_time = 600
注意:max_allowed_packet 在配置文件里可写 256M,但用 SET GLOBAL 命令时必须换算成字节(如 268435456),否则无效。
改完不重启服务=白改
XAMPP 环境下,改完 my.ini 和 php.ini 后必须做两件事:
- 在 XAMPP 控制面板中,**先停掉 MySQL,再停掉 Apache**(顺序不能反,避免残留连接)
- **再依次启动 MySQL、Apache**(Apache 启动后才会加载新
php.ini) - 改完后立刻进 phpMyAdmin 新开一个标签页重试,旧页面仍用旧配置
如果只是临时救急,可在 MySQL 命令行执行:SET GLOBAL max_allowed_packet = 268435456;,但该设置重启即失效,且对已建立的连接不生效。
容易被忽略的客户端限制
即使服务端和 PHP 都调大了,phpMyAdmin 自身也有前端限制:
- 它用 AJAX 提交 SQL,浏览器本身对 POST 数据长度有限制(尤其 IE/Edge)
- 大 SQL 文件建议改用命令行导入:
mysql --max-allowed-packet=256M -u root -p database_name - 若用 PDO 或 mysqli 写脚本,连接时需显式传参:
['options' => [PDO::MYSQL_ATTR_MAX_BUFFER_SIZE => 268435456]]
真正稳定的方案不是堆参数,而是拆分 SQL:超过 50MB 的 dump,优先用 mysqldump --skip-extended-insert 生成多行 INSERT,或按表分文件导入。


















