命令行导入是唯一靠谱的起点,因phpmyadmin、workbench对超50mb sql文件易失败;必须用mysql命令行工具直接操作;大文件需用split拆分(如split -b 500m large.sql part_),再依次导入。

命令行导入是唯一靠谱的起点
图形工具(phpMyAdmin、Workbench)对超过 50MB 的 SQL 文件基本不可靠,不是上传失败就是执行中断。必须用 mysql 命令行工具——它不经过 Web 层或 GUI 中间件,直接喂数据给 MySQL Server,资源占用低、可控性强。
基础命令是:mysql -u root -p mydb 。但仅这样跑大文件,大概率卡住或报错。真正能跑通的关键在三件事:
-
max_allowed_packet必须调大,否则 INSERT 超长语句直接被截断;默认通常只有 4MB,建议设为1G - SQL 文件路径必须是**绝对路径**,且 shell 用户要有读取权限;
~或相对路径在重定向时会失效 - 如果文件含
CREATE DATABASE和USE,就别指定数据库名,否则可能报错“Unknown database”
导入前必须调的几个 MySQL 参数
临时改参数比改配置文件快,而且不用重启服务。登录 MySQL 后逐条执行:
SET GLOBAL max_allowed_packet = 1073741824; SET GLOBAL innodb_buffer_pool_size = 2147483648; SET GLOBAL bulk_insert_buffer_size = 268435456;
这些值不是随便写的:
-
max_allowed_packet=1G:防止单条 INSERT 或建表语句因超限被拒绝 -
innodb_buffer_pool_size设为物理内存的 50%~75%,太小会导致频繁刷盘,太大挤占系统资源 -
bulk_insert_buffer_size专用于加速 INSERT,256MB 对多数场景已足够 - 注意:
SET GLOBAL只对新连接生效,当前会话需重新连一次才能用上
文件太大?拆分比硬扛更稳
哪怕参数调高,单个 >2GB 的 SQL 文件仍容易因磁盘 I/O 或超时中断。Linux/macOS 下用 split 拆分最省事:
split -b 500M large.sql part_
生成 part_aa、part_ab… 文件后,按顺序导入:
mysql -u root -p mydb <p>关键点:</p>
- 不能用
split -l(按行切),会把一条 INSERT 拆成两半,导致语法错误 - 拆分后每块仍要检查开头是否有
USE或SET语句;首块之外的文件开头若含CREATE DATABASE,得手动删掉 - Windows 用户可用
gsplit(Git Bash 提供)或 PowerShell 脚本替代
导入中途出错?别急着重来
大型 SQL 文件里常混着重复主键、缺失外键引用等错误。加 --force 参数让 mysql 忽略错误继续执行:
mysql -u root -p --force mydb <p>但要注意:</p>
-
--force不会跳过语法错误,只跳过运行时错误(如 Duplicate entry) - 导入完务必查日志:
grep -i "error\|warning" /var/log/mysql/error.log(Linux)或 Windows 事件查看器 - 如果大量 INSERT 失败,说明表结构或约束不匹配,此时应先用
mysqldump --no-data导出目标库结构,和源 SQL 对比
真正麻烦的不是文件大,而是 SQL 里隐含的字符集混乱、时间格式不兼容、或 InnoDB 表空间路径硬编码——这些不会报错,但数据会静默损坏。导入后至少抽样验证几条带中文、时间戳、二进制字段的记录。











