“Script timeout passed”是前端超时而非MySQL服务端错误,应先用SHOW PROCESSLIST;检查导入进程是否仍在运行;若存在则等待完成,否则需重导;推荐用命令行mysql替代Web界面以规避超时限制。
MySQL 导入大 SQL 文件时卡住并报 Script timeout passed
这是 mysql 客户端(尤其是 phpmyadmin 或某些 web 界面)的常见限制,不是 mysql 服务端报错,而是前端执行脚本超时中断。服务端其实还在跑,但界面断连了,你看到的“中断”只是前端放弃等待——mysqld 进程很可能仍在执行导入,甚至已接近完成。
- 别急着重试,先用
SHOW PROCESSLIST;看是否有长时间运行的Query状态导入任务 - 如果进程还在,等它自然结束;若已消失,说明真中断了,需要从头或从断点续导
- Web 界面基本不支持“断点续传”,
Script timeout passed是前端 JS 超时,没有记录导入进度
用命令行 mysql 替代 Web 界面导入
绕过所有前端超时限制的唯一可靠方式。本地或服务器终端直连,由系统进程接管,不受浏览器或 PHP 执行时间约束。
- 确保 SQL 文件编码是 UTF-8 无 BOM,否则可能在中文处报错:
ERROR 1064 (42000) - 导入命令最简形式:
mysql -u root -p database_name - 加
--force参数可跳过单条错误继续执行(适合含注释或兼容性语句的大文件):mysql -u root -p --force database_name - 如需实时看进度,可用
pv工具(macOS/Linux):pv file.sql | mysql -u root -p database_name
如何真正实现“从中断位置恢复”?
严格来说,原生 mysql 命令不记录执行位置,无法自动续导。所谓“恢复”,本质是人工定位 + 截断重导。
- 先确认中断点:查最后成功插入的表名或 ID(比如日志里最后一句是
INSERT INTO users ...),或用tail -n 200 file.sql看末尾几段语句结构 - 用文本工具(如
sed或 VS Code)删掉已执行的部分,保留从第一个失败语句开始的所有内容 - 注意:不能简单按行数切,要保证每个
INSERT完整、事务块不被截断(尤其含BEGIN/COMMIT的文件) - 更稳妥的做法是把大文件按
USE或CREATE TABLE拆成多个小文件,逐个导入,出错只重跑当前文件
phpMyAdmin 中避免再次触发 Script timeout passed
如果你必须用它(比如共享主机没命令行权限),就得调参数,但效果有限。
- 修改
php.ini中的max_execution_time和memory_limit(如设为3600和512M),然后重启 PHP 服务 - phpMyAdmin 自身也有配置项:
$cfg['ExecTimeLimit'] = 0;(0 表示不限制),写在config.inc.php里 - 但即便如此,上传阶段仍可能被 Nginx/Apache 的
client_max_body_size或max_allowed_packet拦截,这些必须同步调大 - 实际中,超过 50MB 的 SQL 文件,phpMyAdmin 就不该作为首选方案










