MySQL导入.sql文件出现server gone away错误后如何继续未完成的导入
MySQL 8.0 超大SQL文件断点续导解决方案
前置操作:避免再次触发ERROR 2006: Server has gone away
登录MySQL shell后先执行以下临时参数配置,仅当前会话生效,不会修改原有配置:
SET GLOBAL max_allowed_packet = 1G; SET GLOBAL wait_timeout = 288000; SET GLOBAL interactive_timeout = 288000; SET autocommit = 0; SET unique_checks = 0; SET foreign_key_checks = 0;
第一步:定位中断位置
- 执行
SHOW TABLES;确认已经完全导入完成的表 - 对导入到一半的表执行
SELECT COUNT(*) FROM 目标表名;,记录已插入的行数
第二步:无需打开大文件,直接跳过已执行内容
使用系统自带命令行工具处理16G大文件,无需用文本编辑器加载:
1. 查找半导入表的INSERT语句起始行号
- Linux/macOS 终端执行:
输出的第一个数字就是该表INSERT语句的起始行号,记为grep -n "INSERT INTO \`你的半导入表名\`" /path/to/你的文件.sqlX - Windows PowerShell执行:
输出的LineNumber值记为Select-String -Path "C:\path\to\你的文件.sql" -Pattern "INSERT INTO \`你的半导入表名\`" | Select-Object -First 1 LineNumberX
2. 跳过已完成内容直接导入剩余部分
自动替换INSERT为INSERT_IGNORE避免重复数据报错,无需修改原文件:
- Linux/macOS 终端执行:
sed 's/^INSERT INTO/INSERT IGNORE INTO/g' /path/to/你的文件.sql | tail -n +X | mysql -u 你的用户名 -p 目标数据库名 - Windows PowerShell执行:
(Get-Content "C:\path\to\你的文件.sql" | Select-Object -Skip (X-1)) -replace '^INSERT INTO', 'INSERT IGNORE INTO' | mysql -u 你的用户名 -p 目标数据库名
后续收尾
导入完成后在MySQL shell执行以下命令提交事务并恢复默认约束检查:
COMMIT; SET unique_checks = 1; SET foreign_key_checks = 1;
后续导入优化建议
- 超大文件不要用
source命令导入,直接用命令行管道导入速度提升3-5倍,稳定性更高 - 下次导入前先执行
tee /path/to/导入日志.log,所有执行记录都会写入日志,中断后直接查日志最后执行的行号即可快速定位断点
内容的提问来源于stack exchange,提问作者lyra
相关产品推荐
相关产品推荐

