根本原因是php临时目录upload_tmp_dir权限不足或路径不可写,需手动创建可写目录、设正确属主和权限、在php.ini中显式配置并重启服务,同时排除open_basedir、selinux及磁盘配额限制。

phpMyAdmin 导入大文件失败,根本不是内存或超时问题
常见现象是上传 .sql 文件时卡在“正在导入”,或报错 File upload error — the uploaded file exceeds the upload_max_filesize directive in php.ini,但改了 upload_max_filesize 和 post_max_size 仍无效——真正卡点往往在临时目录权限或路径不可写。phpMyAdmin 本身不管理上传后的临时落盘,完全依赖 PHP 的 upload_tmp_dir 配置和系统级写入能力。
必须显式配置 PHP 的 upload_tmp_dir,不能靠默认值
PHP 默认使用系统 /tmp,但该目录常被 noexec 挂载、受 SELinux 限制,或被清理工具定期清空,导致上传中途失败。解决方式是为 PHP 单独指定一个稳定、可写的临时目录:
- 创建目录(例如
/var/php-upload-tmp):sudo mkdir -p /var/php-upload-tmp
- 设属主为 Web 服务器用户(Apache 通常是
apache,Nginx + PHP-FPM 通常是www-data或nginx):sudo chown www-data:www-data /var/php-upload-tmp
- 设权限为
755(700会导致部分 PHP 版本拒绝写入):sudo chmod 755 /var/php-upload-tmp
- 在
php.ini中设置:upload_tmp_dir = /var/php-upload-tmp
- 重启 PHP 服务(如
sudo systemctl restart php-fpm或sudo systemctl restart apache2)
phpMyAdmin 自身不读取 tmpdir,别去动 MySQL 的 tmpdir
有人误以为改 MySQL 的 tmpdir(通过 SHOW VARIABLES LIKE 'tmpdir' 查看)能影响导入,这是误区。MySQL 的 tmpdir 只控制它自己内部排序、临时表、ALTER 表等操作的路径,和 phpMyAdmin 文件上传流程完全无关。你改了 tmpdir 并重启 mysqld,对上传失败毫无帮助。
验证是否生效:上传一个极小的 SQL 文件(比如 1KB),成功后检查该目录下是否有类似 phpXXXXXX 的临时文件生成;没有则说明 upload_tmp_dir 未生效或权限不对。
容易被忽略的三个硬性条件
即使路径、权限、PHP 配置全对,以下三点任一不满足,上传仍会静默失败:
-
open_basedir限制了 PHP 可访问路径,若未包含/var/php-upload-tmp,PHP 直接拒绝写入——检查php.ini或虚拟主机配置中的open_basedir,追加该路径 - SELinux 开启时,目录缺少
httpd_tmp_t上下文(Apache)或httpd_sys_rw_content_t(Nginx):sudo semanage fcontext -a -t httpd_tmp_t "/var/php-upload-tmp(/.*)?"<br>sudo restorecon -Rv /var/php-upload-tmp
- 磁盘配额(
quota)或 inodes 耗尽,df -i和df -h必须都检查,尤其小分区挂载的/var
ls -ld /var/php-upload-tmp 看权限,再 sudo -u www-data touch /var/php-upload-tmp/test 验证写入能力。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











