命令“mysql -u root -p mydb”表示以root用户身份登录MySQL并直接连接到名为mydb的数据库;执行后会提示输入密码,验证通过即进入mysql>交互界面并默认选中mydb库。

直接用 mysql -u root -p mydb 命令导入,配合关键参数调优和前置准备,才能真正“快速”——跳过图形工具、不进 MySQL 客户端交互、不依赖 <code>source 逐行执行,是提速的核心前提。
为什么不能用 phpMyAdmin 或 Workbench 导入大文件
这类工具本质是 HTTP 接口 + PHP/Java 中间层,受三重限制:上传大小(upload_max_filesize 默认常为 2M)、脚本执行时间(max_execution_time)、内存上限(PHP 的 memory_limit)。即使你改了配置,MySQL 客户端本身仍可能因 max_allowed_packet 不足而中断,最终报错 Packets larger than max_allowed_packet are not allowed。几十 MB 以上就大概率失败,几百 MB 基本不可行。
导入前必须调整的三个 MySQL 全局参数
这些值必须在 MySQL 服务运行时动态设置,或写入 my.cnf 后重启(推荐后者,避免重启后丢失):
-
SET GLOBAL max_allowed_packet = 1073741824;(即 1G),否则 INSERT 大批量数据行会直接被截断 -
SET GLOBAL innodb_log_file_size = 512 * 1024 * 1024;(512MB),尤其对 InnoDB 表多、事务大的备份,能显著减少 checkpoint 频率 -
SET GLOBAL wait_timeout = 28800;(8 小时),防止导入中途因空闲超时断连
注意:innodb_log_file_size 修改后需停库、删旧日志文件(ib_logfile0/ib_logfile1)、再启库才生效;其他两个可热设。
命令行导入时绕不开的编码与权限坑
常见现象是中文变 ??? 或报错 Incorrect string value: '\xF0\x9F\x98\x80' for column,本质是字符集不匹配:
- 确保 SQL 文件本身是
UTF8MB4编码(用file -i backup.sql或 VS Code 底部状态栏确认) - 导入命令必须显式声明:
mysql -u root -p --default-character-set=utf8mb4 mydb - 目标数据库创建时也要指定:
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 用户需有
FILE权限(本地 root 默认有),若报ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option,说明文件路径不在secure_file_priv目录内,得把 SQL 文件挪到SHOW VARIABLES LIKE 'secure_file_priv';返回的路径下
超过 2GB 的文件要拆分+禁用约束加速
单纯调大参数还不够。真正卡顿来自索引维护和外键检查。实操中发现,禁用这两项 + 分片导入,速度常提升 3–5 倍:
- 导入前,在 SQL 文件开头插入:
SET FOREIGN_KEY_CHECKS = 0; SET UNIQUE_CHECKS = 0; SET autocommit = 0; - 导入完成后,在文件末尾追加:
SET FOREIGN_KEY_CHECKS = 1; SET UNIQUE_CHECKS = 1; COMMIT; - 用
split -l 500000 backup.sql chunk_拆成每 50 万行一个文件(避免切在 INSERT 语句中间),再循环导入:for f in chunk_*; do mysql -u root -p --default-character-set=utf8mb4 mydb
最后别忘了:大文件导入不是“执行完就完事”,一定要立刻验证 SELECT COUNT(*) FROM 表名 和几条随机记录内容——因为 --force 参数虽能跳过错误继续,但 silently 丢数据比报错更危险。


















