命令行导入比图形工具快2–5倍且无文件大小限制,但默认参数下可能极慢,关键需关闭两个日志刷盘动作。

命令行导入比图形工具快 2–5 倍,且无文件大小限制;但默认参数下仍可能慢得离谱——关键在关掉两个日志刷盘动作。
mysql -u -p
这个命令能跑通,依赖三个硬性条件:
- 目标数据库(如
mydb)必须已存在,否则报错ERROR 1049 (42000): Unknown database 'mydb' -
file.sql文件路径需为 shell 可读(Windows 下注意反斜杠或双引号包裹含空格路径,如"D:\backup\prod.sql") - SQL 文件编码需为 UTF-8(无 BOM),否则中文字段名或注释可能触发
ERROR 1064或乱码
大文件导入卡住?先禁用 innodb_flush_log_at_trx_commit 和 sync_binlog
默认值都为 1,意味着每条 INSERT 都强制刷盘,百万级数据就等于百万次磁盘 I/O。临时调低可提速 3–8 倍:
- 登录 MySQL 后执行:
SET GLOBAL innodb_flush_log_at_trx_commit = 0; - 再执行:
SET GLOBAL sync_binlog = 0; - 导入完成务必恢复:
SET GLOBAL innodb_flush_log_at_trx_commit = 1;和SET GLOBAL sync_binlog = 1;(否则事务安全性丢失)
注意:这两个 SET 只对当前会话生效,重启 MySQL 后自动还原;若用 mysql -u -p db 方式,需提前在 MySQL 配置文件 <code>my.cnf 的 [mysqld] 段里加临时配置,导入完再删。
source 命令适合调试,但默认不支持相对路径和通配符
在 MySQL 客户端内用 SOURCE 能看到逐行执行过程,方便定位报错位置(比如某张表建表失败停在哪一行),但它有严格路径限制:
- 必须用绝对路径,
SOURCE ./backup.sql会报错Failed to open file './backup.sql', error: 2 - 不能展开通配符,
SOURCE /data/*.sql不生效;想批量导入,得写个 wrapper SQL 文件,内容为:SOURCE /data/a.sql; SOURCE /data/b.sql; SOURCE /data/c.sql;
然后执行SOURCE /data/all.sql - 执行前记得先
USE target_db;,否则SOURCE不知道往哪导
导入后数据量对不上?检查 SQL 文件是否含 USE 和 CREATE DATABASE
有些 mysqldump 导出的文件开头带 CREATE DATABASE 和 USE,如果目标库已存在,这部分语句会报错(ERROR 1007 (HY000): Can't create database 'xxx'; database exists),但 mysql 客户端默认继续执行后续语句——看起来“成功”,实则跳过了建表逻辑。
解决办法只有两个:
- 用
grep -n "CREATE DATABASE\|USE" backup.sql查看是否含这些语句,有则手动删掉或加--skip-create-db --skip-create-table重导 - 或者导入前加
-f参数强制忽略错误:mysql -u root -p -f mydb ,但要确认跳过的错误是否真可忽略
真正容易被忽略的是:mysqldump 默认导出的 INSERT 是扩展格式(INSERT INTO t VALUES (),(),()...),但若用了 --skip-extended-insert,单条插入会导致导入速度暴跌——查文件头几行就能判断。


















