phpMyAdmin 在 Nginx 环境下导入大文件失败,根本原因通常不是程序本身,而是 Nginx、PHP 与 phpMyAdmin 三层配置同时限制了上传流程——Nginx 的 client_max_body_size 会触发 413 错误,PHP 的 upload_max_filesize 和 post_max_size 需要同步调大并重启服务,phpMyAdmin 的 $cfg['MaxImportFileSize'] 也需要手动设置,而且单位必须是字节。

需要特别说明的是,限制大文件导入的往往并不是 phpMyAdmin 自身,而是 Nginx、PHP、phpMyAdmin 这三层配置共同卡住了上传链路——只要任意一层超过限制,就可能出现 Incorrect format parameter 或 413 Request Entity Too Large 这类报错。
为什么Nginx会直接拦截大文件上传
Nginx 在接收 HTTP POST 上传请求时,会优先判断请求体大小是否超过 client_max_body_size。如果文件体积超出这个上限,Nginx 不会再把请求交给 PHP 处理,而是直接返回 413 Request Entity Too Large(HTTP 413 状态码)。这也意味着,在这种情况下 phpMyAdmin 根本还没来得及执行。
- 宝塔面板中该参数默认通常为 100M,如果你要导入 200MB 甚至更大的 SQL 文件,就必须手动提高限制
- 修改位置:宝塔 → Nginx → 配置修改 → 在
http{}块内新增或调整client_max_body_size 512M; - 修改后必须执行「重载配置」而不是重启服务,否则新配置不会生效;更新完成后,可使用
curl -X POST --data-binary @large.sql https://your-site.com/phpmyadmin/import.php测试是否还会返回 413
PHP的upload_max_filesize和post_max_size必须同步调大
即使 Nginx 已经放行大文件,PHP 仍会按照自身的上传限制进行第二层校验。关键点在于:post_max_size 必须大于或等于 upload_max_filesize,否则 POST 数据可能被截断,phpMyAdmin 读取到的将是不完整内容,最终就容易报出 Incorrect format parameter。
- 在宝塔中的修改路径:→ PHP 设置 → 配置修改 → 找到并调整这两项:
upload_max_filesize = 512M、post_max_size = 512M - 建议同时增大
max_execution_time = 1200和memory_limit = 1G,避免数据库导入过程中因超时或内存不足而中断 - 修改完成后必须「重启 PHP 服务」,不能只做重载,否则在 phpinfo() 中看到的仍然是旧配置
phpMyAdmin自身也有隐藏限制
即便 Nginx 和 PHP 的上传限制都已经放开,phpMyAdmin 自身的 $cfg['MaxImportFileSize'] 仍可能成为隐藏门槛。这个参数默认可能未显式定义,此时会回退到 PHP 的 upload_max_filesize;但如果你手动设置了更小的值,就会以该值为准,导致导入文件被限制。
- 编辑宝塔环境中 phpMyAdmin 的
config.inc.php文件(一般位于/www/server/phpmyadmin/目录) - 在
$cfg['UploadDir'] = 'upload';后面添加:$cfg['MaxImportFileSize'] = 536870912; // 单位是字节,512MB - 注意:这个参数主要影响 phpMyAdmin 页面显示的最大可导入值,并不能替代 PHP 或 Nginx 的限制;如果它设置得比 PHP 更大,实际生效的仍然以 PHP 限制为准
导入成功后仍可能丢数据?检查SQL文件头尾
即便通过命令行导入绕过了上传大小限制,大型 SQL 文件仍然可能存在隐蔽问题。例如文件开头包含 SET FOREIGN_KEY_CHECKS=0; 却没有对应的 SET FOREIGN_KEY_CHECKS=1;,或者文件末尾缺少 COMMIT;,都可能导致部分事务没有真正写入数据库。
- 可以通过
head -n 20 large.sql和tail -n 20 large.sql快速检查文件头尾,重点查看外键检查开关、字符集声明(如DEFAULT CHARSET=utf8mb4)以及事务控制语句是否完整 - 导入完成后建议执行:
SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'your_db';先核对数据表数量,再随机抽查几个大表的COUNT(*)以确认记录数是否正常 - 如果使用
mysql -u root -p db_name < file.sql导入失败却没有明显提示,可以加上-v参数查看详细报错:mysql -v -u root -p db_name < file.sql
最容易被忽视的一点是:Nginx 重载、PHP 重启、phpMyAdmin 配置调整,这三步缺一不可,而且处理顺序最好不要弄反——先修改并重载 Nginx,再调整并重启 PHP,最后补充 phpMyAdmin 配置。只要漏掉其中任何一步,都可能让你反复遇到看似模糊却一直存在的“格式参数错误”。
