必须同步调大MySQL的max_allowed_packet和PHP的upload_max_filesize、post_max_size等参数,否则仅改一端仍会失败;需在my.cnf的[mysqld]段设max_allowed_packet=64M,php.ini中对应调高四值并重启服务。
直接改 max_allowed_packet 是最常见、最有效的解法,但必须同时调大 php 和 mysql 两端的限制,否则只改一半照样失败。
为什么导入大 SQL 文件会触发 “MySQL server has gone away”
这个错误不是数据库崩了,而是连接中途被主动切断。根本原因有两个:
-
max_allowed_packet太小:MySQL 默认只允许单次传输 1MB 数据,一个含TEXT或BLOB的INSERT语句就可能超限,直接断连 - PHP 层上传/执行超限:即使 MySQL 接收得了,
php.ini里的upload_max_filesize、post_max_size、memory_limit或max_execution_time卡住了请求,导致请求没发全或超时中断
必须同步修改的三个配置位置
只改 MySQL 配置或只改 PHP 配置,都会白忙活。三处缺一不可:
-
MySQL 配置文件(
my.cnf或my.ini):在[mysqld]段下加一行max_allowed_packet = 64M
(别用 100M 这种整数,部分旧版 MySQL 解析失败;64M 是安全上限) -
PHP 配置文件(
php.ini):确认以下四值都 ≥ 你 SQL 文件大小upload_max_filesize = 64Mpost_max_size = 64Mmemory_limit = 128Mmax_execution_time = 600 -
重启服务:
Linux 下执行sudo systemctl restart mysql && sudo systemctl restart apache2(或nginx)
Windows 下需重启 MySQL 服务 + Web 服务器(如 Apache)
导入前检查和绕过技巧
如果无法改服务器配置(比如共享主机),可以临时绕开:
- 用
mysql命令行导入(跳过 phpMyAdmin):mysql -u username -p database_name <br>——它不受 <code>php.ini限制,只依赖 MySQL 的max_allowed_packet - 拆分大 SQL 文件:用
split -l 500 backup.sql part_按行切分,再逐个在 phpMyAdmin 中导入 - 避免
INSERT合并:导出时用mysqldump --skip-extended-insert,让每条记录单独成行,降低单包体积
容易被忽略的是:改完配置后,必须验证是否生效。登录 MySQL 执行 SHOW VARIABLES LIKE 'max_allowed_packet';,看到的值是字节单位(比如 67108864 = 64M),不是你写的 “64M”。如果还是 1048576(即 1M),说明配置没加载成功——大概率是写错了段落(比如写进 [client] 而非 [mysqld]),或者文件路径不对。
立即学习“PHP免费学习笔记(深入)”;



















