典型错误是“got a packet bigger than 'max_allowed_packet' bytes”,主因是mysql服务端及php层(phpmyadmin)的max_allowed_packet、upload_max_filesize等参数过小,需同步调大并重启服务,或改用命令行导入。

MySQL 导入大 SQL 文件失败的典型错误是什么
常见现象是执行导入时卡住、报错或直接中断,最典型的错误信息是:Got a packet bigger than 'max_allowed_packet' bytes。这说明当前 MySQL 允许接收的最大单个数据包太小,而你的 SQL 文件里可能包含超长的 INSERT 语句(比如含大字段、BLOB、长文本),或者整个文件被客户端一次性读取后尝试作为单个请求发送。
注意:这个限制同时存在于服务端(max_allowed_packet)和客户端(如 phpMyAdmin、Navicat、mysql 命令行工具),但宝塔面板默认用的是 PHP+phpMyAdmin 方式导入,所以实际瓶颈往往在 PHP 层或 MySQL 客户端配置上。
如何确认并修改 MySQL 服务端的 max_allowed_packet
先登录服务器终端,检查当前值:
mysql -u root -p -e "SHOW VARIABLES LIKE 'max_allowed_packet';"
看到的值通常是 4194304(即 4MB),对几百 MB 的 SQL 文件完全不够。
修改方式分两步:
- 编辑 MySQL 配置文件:
/www/server/mysql/my.cnf - 在
[mysqld]段落下添加或修改:max_allowed_packet = 512M
- 重启 MySQL:
service mysqld restart
⚠️ 注意:数值单位必须写 M(大写),不能写 m 或 MB;也不能写成 512<em>1024</em>1024 这种表达式,MySQL 不识别。
为什么改了服务端还不行?别忘了 phpMyAdmin 和 PHP 的限制
宝塔面板通过 phpMyAdmin 导入,它本身受 PHP 运行环境约束:
-
upload_max_filesize和post_max_size必须 ≥ SQL 文件大小(比如设为512M) -
max_execution_time和max_input_time要调高(否则超时中断,建议设为3600) - 修改位置:
/www/server/php/{版本号}/etc/php.ini,改完执行:service php-fpm-{版本号} reload
另外,phpMyAdmin 自身也有导入限制,在 /www/server/phpmyadmin/libraries/config.default.php 中搜索 $cfg['UploadDir'] 上方附近,找到:
$cfg['ExecTimeLimit'] = 0;
确保这行存在且值为 0(表示不限制执行时间)。
更可靠的大文件导入方式:绕过 phpMyAdmin 直接命令行导入
如果改完配置仍失败,或者文件超过 1GB,建议放弃面板上传,改用终端导入:
- 把 SQL 文件上传到服务器任意目录,比如:
/home/sql/backup.sql - 执行导入命令(注意指定字符集,避免乱码):
mysql -u root -p --default-character-set=utf8mb4 数据库名
- 如果提示
ERROR 2006 (HY000),说明客户端 packet 不够,加参数强制提升:mysql -u root -p --max_allowed_packet=512M --default-character-set=utf8mb4 数据库名
这个 --max_allowed_packet 是客户端参数,和 my.cnf 里的服务端设置独立,必须显式指定才生效。
大文件导入耗时较长,别关终端;导入中途断开可用 screen 或 nohup 包裹。
有些 SQL 文件开头没指定数据库,记得先手动创建空库:CREATE DATABASE <code>dbname DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
改配置容易,但漏掉客户端或 PHP 层任一环节都会白忙;真正稳定的大文件迁移,终究得回到命令行。











