- 1 1. 本文您将能够做到的事情
- 2 2. MySQL 导入方式及适用场景
- 3 3. 导入 SQL 文件(最快成功之路)
- 4 4. CSV 导入(最重要:使用 LOAD DATA 的最快方式)
- 5 5. Top 4 Reasons INFILE Fails (Most Important Section)
- 6 6. Import via GUI (Workbench / phpMyAdmin)
- 7 6.1 使用 MySQL Workbench 导入
- 8 6.2 使用 phpMyAdmin 导入
- 9 6.3 何时使用 GUI
- 10 6.4 何时使用 CLI(推荐)
- 11 ✔ 实际结论
- 12 7. 故障排除(按错误:原因 → 最快修复)
- 13 8. 大型数据集的实际技术(防故障操作)
- 14 9. 常见问题解答(常见问题)
- 15 10. 总结
1. 本文您将能够做到的事情
许多人在搜索 “MySQL 数据导入” 时,往往处于以下情形:
- “恢复 .sql 文件”
- “导入 CSV”
- “出现错误而停止”
- “在 Workbench 或 phpMyAdmin 中无法工作”
换句话说,您需要一个 可以立刻使用的解决方案。
首先,这里按目标列出最简的 “成功路径”。
🔹 导入 SQL 文件(.sql)的最快命令
用于备份恢复或服务器迁移,这是最快的方法。
mysql -u username -p database_name < backup.sql
事前检查事项
- 目标数据库是否已存在?
- 连接用户是否拥有目标库的权限?
- SQL 文件的编码(通常为 UTF-8)
如果数据库尚未创建:
CREATE DATABASE example_db;
🔹 导入 CSV 文件的最快方式(推荐)
要快速导入大量数据,LOAD DATA 是理想选择。
LOAD DATA LOCAL INFILE '/path/to/example.csv'
INTO TABLE example_table
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(id, name, @age)
SET age = NULLIF(@age,'');
关键要点
- Windows 换行符 →
'\r\n' - 若有表头行 →
IGNORE 1 LINES - 将空字符串转换为 NULL →
NULLIF() - 许多环境需要使用 LOCAL(后文解释)
🔹 如果您想通过 GUI 导入
MySQL Workbench
- Server → Data Import → 选择文件 → 运行
phpMyAdmin
- 选择目标库 → Import → 选择文件 → 运行
⚠ 但是,对于大文件和可靠的错误处理,CLI(命令行)更为稳妥。
🔹 导入前必须检查的 3 项
1. 字符集(最重要)
SHOW VARIABLES LIKE 'character_set%';
推荐使用:utf8mb4
2. 导致 INFILE 错误的设置
SHOW VARIABLES LIKE 'local_infile';
SHOW VARIABLES LIKE 'secure_file_priv';
3. 权限检查
SHOW GRANTS FOR 'user'@'localhost';
✔ 本文接下来的内容
- 详细的 SQL 文件导入方式
- 实用的 CSV 导入技巧
- INFILE 失败的完整解析
- 按错误类型的最快修复方案
- 大数据集的实战技巧

2. MySQL 导入方式及适用场景
导入 MySQL 的方式有多种,但 最佳选择取决于您的使用场景。
如果您正确理解这些方式,就能避免不必要的麻烦。
2.1 导入 SQL 转储(.sql)时机
常见使用场景
- 从备份恢复
- 服务器迁移
- 将生产环境数据应用到开发环境
- 重新导入使用
mysqldump导出的数据
特点
- 恢复完整的表结构 + 数据
- 高可复现性
- 可包含事务
- 通常是最安全的选项
常用方法
mysql -u user -p dbname < dump.sql
或在 MySQL 内部执行:
SOURCE /path/to/dump.sql;
适合场景
- 对已有数据库进行完整恢复
- 重建生产环境
- CI/CD 环境的数据加载
2.2 导入 CSV / TSV 时机
常见使用场景
- 接收外部系统的数据
- 导入 Excel 数据
- ETL 处理
- 仅更新特定表
特点
- 只加载数据(模式需单独存在)
- 快速(
LOAD DATA极其高速) - 可在导入时进行转换逻辑
常用方法
LOAD DATA LOCAL INFILE 'file.csv'
INTO TABLE table_name
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n';
适合场景
- 定时批处理作业
- 数据集成
- 大批量行数的高速写入
2.3 使用 GUI 工具时机
常见工具:
- MySQL Workbench
- phpMyAdmin
特点
- 操作直观
- 对初学者友好
- 适合小数据集
注意事项
- 上传限制(phpMyAdmin)
- 超时问题
- 大数据时不稳定
- 错误分析较困难
2.4 按方法比较(实用视角)
| Method | Speed | Stability | Large-file support | Error analysis | Recommendation |
|---|---|---|---|---|---|
| mysql command | ◎ | ◎ | ◎ | ◎ | ★★★★★ |
| LOAD DATA | ◎ | ○ | ◎ | ○ | ★★★★★ |
| Workbench | ○ | ○ | △ | △ | ★★★ |
| phpMyAdmin | △ | △ | × | △ | ★★ |
✔ 实际工作中的推荐选择
- 备份恢复 → mysql 命令
- 高速 CSV 导入 → LOAD DATA LOCAL INFILE
- 小型、一次性任务 → GUI
如果不确定,选择 CLI(命令行)是最稳妥的选项。
3. 导入 SQL 文件(最快成功之路)
导入 .sql 文件是 备份恢复和服务器迁移最常用的方法。
这里的目标是“尽快成功”,因此我们只关注实际工作中使用的实用步骤。
3.1 一行恢复(最常用方法)
这是最可靠且最快的方法。
mysql -u username -p database_name < backup.sql
运行后,会提示输入密码。
✔ 预检查(防止失败)
① 数据库是否存在?
SHOW DATABASES;
如果不存在:
CREATE DATABASE example_db;
② 用户是否拥有权限?
SHOW GRANTS FOR 'user'@'localhost';
如果缺少权限:
GRANT ALL PRIVILEGES ON example_db.* TO 'user'@'localhost';
FLUSH PRIVILEGES;
③ 文件编码
通常为 UTF-8。
如果出现乱码,请显式指定编码。
mysql --default-character-set=utf8mb4 -u user -p dbname < backup.sql
3.2 在 MySQL 内部运行(SOURCE 命令)
此方法在登录 MySQL 后执行。
mysql -u user -p
USE example_db;
SOURCE /path/to/backup.sql;
适用场景
- 只想运行 SQL 文件的部分内容时
- 想要定位具体错误位置时
- 想要直观看到执行日志时
3.3 常见错误及解决方案
❌ ERROR 1049: Unknown database
→ 数据库不存在
→ 执行 CREATE DATABASE
❌ ERROR 1045: Access denied
→ 权限不足
→ 使用 SHOW GRANTS 检查
❌ 中途停止 / 错误位置不明确
解决办法:
- 检查文件的开头和结尾
head backup.sql tail backup.sql
- 检查错误前的几行
- 如果文件很大,拆分后分段运行
split -l 10000 backup.sql part_
3.4 稳定大规模 SQL 导入的技巧
① 检查事务设置
查看是否包含 SET autocommit=0;
② 如果外键约束导致问题
SET FOREIGN_KEY_CHECKS=0;
-- import
SET FOREIGN_KEY_CHECKS=1;
③ 检查 SQL 模式
SELECT @@sql_mode;
严格模式可能影响导入。
✔ 实用建议
- 生产环境恢复 → mysql 命令
- 调试 → SOURCE
- 大文件 → CLI + 考虑拆分
4. CSV 导入(最重要:使用 LOAD DATA 的最快方式)
导入 CSV 数据时,最快且最实用的方法是 LOAD DATA。
对于大数据集,它远快于 INSERT 语句。
这里提供 正确的“复制粘贴运行”格式,并指出常见的错误点。
4.1 第一步:CSV 前置条件
导入前,请务必检查以下内容。
✔ 分隔符
- 逗号
, - 制表符
\t - 分号
;(海外数据常见)
✔ 引用字符
- 值是否被双引号(如
"value")包裹
✔ 行结束符
- Linux / Mac →
\n - Windows →
\r\n
✔ 字符集 / 编码
- 推荐:
utf8mb4 - Windows 上生成的 CSV 可能是 Shift-JIS 编码
- 带 BOM 的 UTF-8 有时会导致错误
示例检查:
file -i example.csv
4.2 可直接复制粘贴的基本格式(带表头的 CSV)
LOAD DATA LOCAL INFILE '/path/to/example.csv'
INTO TABLE example_table
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(id, name, @age)
SET age = NULLIF(@age,'');
各选项含义
LOCAL从客户端读取文件(在许多环境中必需)IGNORE 1 LINES跳过标题行@age用于在存储前转换值的临时变量NULLIF()将空字符串转换为 NULL
4.3 Import only the columns you need
仅导入所需列
如果 CSV 包含不需要的列:
LOAD DATA LOCAL INFILE '/path/to/example.csv'
INTO TABLE example_table
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(id, @dummy, age);
将不需要的列映射到 @dummy。
4.4 Convert dates and types during import
在导入时转换日期和类型
示例:将 MM/DD/YYYY → MySQL 格式
LOAD DATA LOCAL INFILE '/path/to/example.csv'
INTO TABLE example_table
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(@date_col, name)
SET date_col = STR_TO_DATE(@date_col, '%m/%d/%Y');
4.5 For tab-delimited (TSV)
针对制表符分隔(TSV)
FIELDS TERMINATED BY '\t'
4.6 Improve performance further (for large data)
进一步提升性能(针对大数据)
Temporarily disable indexes
临时禁用索引
ALTER TABLE example_table DISABLE KEYS;
-- Run LOAD DATA
ALTER TABLE example_table ENABLE KEYS;
Temporarily disable foreign keys
临时禁用外键
SET FOREIGN_KEY_CHECKS=0;
-- Run LOAD DATA
SET FOREIGN_KEY_CHECKS=1;
Why LOCAL is often required
为什么经常需要使用 LOCAL
LOAD DATA INFILE→ 在服务器端读取文件LOAD DATA LOCAL INFILE→ 在客户端读取文件
在许多环境中,使用 LOCAL 的成功率更高。
✔ Practical recommended form
实用的推荐写法
在大多数情况下:
LOAD DATA LOCAL INFILE
+ explicit delimiter
+ explicit line endings
+ IGNORE 1 LINES
+ type conversion
这是最稳定的做法。
5. Top 4 Reasons INFILE Fails (Most Important Section)
INFILE 失败的四大原因(最重要章节)
大多数 LOAD DATA INFILE 失败是由于 设置、权限或对源位置的误解 引起的。
如果你了解这些,就能立即解决大多数错误。
5.1 Difference between INFILE and LOCAL INFILE
INFILE 与 LOCAL INFILE 的区别
这是关键的基本概念。
| Command | Where it reads from | Typical use |
|---|---|---|
LOAD DATA INFILE | File on the server | A fixed path on the server |
LOAD DATA LOCAL INFILE | File on the client | A CSV on your local PC |
Common misunderstandings
常见误解
- 尝试使用
INFILE读取本地 PC 文件却失败 - 文件在服务器上不存在
✔ Quick rule of thumb
快速经验法则
- CSV 在本机 PC 上 →
LOCAL - CSV 放在服务器上 →
INFILE
如果不确定,使用 LOCAL 是最安全的选择。
5.2 local_infile is disabled (cause of ERROR 1148)
local_infile 被禁用(导致 ERROR 1148)
错误示例:
ERROR 1148 (42000): The used command is not allowed with this MySQL version
原因:
local_infile 为 OFF
✔ Check the current setting
检查当前设置
SHOW VARIABLES LIKE 'local_infile';
✔ Enable it when connecting (client-side)
连接时启用(客户端)
mysql --local-infile=1 -u user -p
✔ Enable permanently (config file)
永久启用(配置文件)
添加到 my.cnf 或 my.ini:
[mysqld]
local_infile=1
必须重启服务器。
5.3 secure_file_priv restriction
secure_file_priv 限制
当使用 LOAD DATA INFILE(不带 LOCAL)时会出现此情况。
检查:
SHOW VARIABLES LIKE 'secure_file_priv';
Example output
示例输出
/var/lib/mysql-files/
→ 只能读取此目录内的文件。
✔ Fix
解决办法
- 将 CSV 移动到允许的目录中
- 或使用
LOCAL
5.4 Insufficient privileges (FILE privilege / OS permissions)
权限不足(FILE 权限 / 操作系统权限)
错误示例:
ERROR 1045: Access denied
检查:
SHOW GRANTS FOR 'user'@'localhost';
✔ Required privilege
所需权限
GRANT FILE ON *.* TO 'user'@'localhost';
※ 为了安全,尽量使用最小权限操作。
5.5 Incorrect path specification
路径指定错误
- 使用绝对路径,而非相对路径
- 在 Windows 上,推荐使用
C:/path/file.csv - 正斜杠比反斜杠更安全
✔ Fast troubleshooting flow for INFILE issues
快速排查 INFILE 问题的流程
- 是否添加了
LOCAL? SHOW VARIABLES LIKE 'local_infile';SHOW VARIABLES LIKE 'secure_file_priv';- 检查权限(SHOW GRANTS)
- 检查路径(绝对路径)
按此顺序,你可以解决大多数情况。
6. Import via GUI (Workbench / phpMyAdmin)
通过 GUI 导入(Workbench / phpMyAdmin)
The command line is the most stable, but there are situations where you want to use GUI tools.
Here, we’ll focus on the common points where people get stuck in real work.
6.1 使用 MySQL Workbench 导入
导入 SQL 文件(备份恢复)
- 启动 Workbench
- 菜单 → Server → Data Import
- 选择 “Import from Self-Contained File”
- 选择
.sql文件 - 选择目标 Schema(数据库)
- 点击 “Start Import”
导入 CSV(每个表)
- 右键点击目标表
- 选择 Table Data Import Wizard
- 选择 CSV 文件
- 设置分隔符以及是否有表头
- 运行
⚠ Workbench 卡住的常见原因
- 大文件(数百 MB 甚至更大)
- 超时
- 编码不匹配
secure_file_priv限制
👉 对于大文件或生产环境,建议使用 CLI。
6.2 使用 phpMyAdmin 导入
步骤
- 选择目标数据库
- 打开 “Import” 选项卡
- 选择文件
- 选择格式(SQL / CSV)
- 运行
⚠ phpMyAdmin 限制
① 上传大小限制
upload_max_filesize
post_max_size
大文件会失败。
② 超时
max_execution_time长时间运行的导入可能会中途停止。
③ 内存不足
memory_limit6.3 何时使用 GUI
- 小数据集(几 MB)
- 开发环境
- 临时一次性工作
6.4 何时使用 CLI(推荐)
- 生产环境
- 数十 MB 以上
- 大规模 CSV 导入
- 需要错误分析时
- 服务器间迁移
✔ 实际结论
GUI “简单”,但
CLI 在稳定性、可复现性以及大文件处理方面压倒性更好。
对于故障排除,最终建议学习 CLI 操作。
7. 故障排除(按错误:原因 → 最快修复)
大多数 MySQL 导入错误都有 高度模式化。
这里,我们按 “原因 → 首先操作 → 验证命令” 的顺序组织它们。
7.1 ERROR 1148 (42000)
所使用的命令在此 MySQL 版本中不被允许
🔎 原因
LOAD DATA LOCAL INFILE已禁用local_infile为 OFF
✅ 最快修复
① 检查当前设置
SHOW VARIABLES LIKE 'local_infile';
② 连接时启用(客户端)
mysql --local-infile=1 -u user -p
③ 永久启用(如有需要)
[mysqld]
local_infile=1
→ 重启 MySQL
7.2 ERROR 1366
字符串值不正确
🔎 原因
- 编码不匹配
- utf8 与 utf8mb4 不一致
- 混入 Shift-JIS
✅ 最快修复
① 检查当前字符集
SHOW VARIABLES LIKE 'character_set%';
② 将表转换为 utf8mb4
ALTER TABLE example_table CONVERT TO CHARACTER SET utf8mb4;
③ 在导入时显式指定
mysql --default-character-set=utf8mb4 -u user -p db < file.sql
7.3 ERROR 1062
重复条目
🔎 原因
- 主键重复
- UNIQUE 约束冲突
✅ 修复选项
选项 1:忽略重复
LOAD DATA LOCAL INFILE 'file.csv'
INTO TABLE example_table
IGNORE;
选项 2:重复时更新
INSERT INTO example_table (id, name)
VALUES (1,'John')
ON DUPLICATE KEY UPDATE name=VALUES(name);
选项 3:使用临时表
CREATE TEMPORARY TABLE temp LIKE example_table;
-- LOAD into temp first
INSERT INTO example_table
SELECT * FROM temp;
7.4 ERROR 1045
用户访问被拒绝
🔎 原因
- 数据库权限不足
- FILE 权限不足
- 路径的操作系统权限不足
✅ 检查
SHOW GRANTS FOR 'user'@'localhost';
✅ 示例所需权限
GRANT ALL PRIVILEGES ON example_db.* TO 'user'@'localhost';
FLUSH PRIVILEGES;
※ 授予 FILE 权限时请谨慎。
7.5 大文件导入中途停止
🔎 原因
- 超时
- 内存不足
- PHP 限制 (phpMyAdmin)
✅ 最快的对策
增加超时时间
SET GLOBAL net_read_timeout=600;
SET GLOBAL net_write_timeout=600;
分割文件
split -l 100000 large.csv part_
✔ 错误解决流程(最快)
- 检查编码
- 检查
local_infile - 检查
secure_file_priv - 检查权限
- 检查行结束符 (
\n/\r\n)
按照这个顺序,你可以解决大多数问题。
8. 大型数据集的实际技术(防故障操作)
导入数十万到数百万行时,
通常的方法可能会变慢、停止或中断。
这里是生产环境中常用的稳定技术。
8.1 分割文件并分阶段导入
一次性导入巨大的 CSV/SQL 可能会导致内存和超时问题。
✔ Linux / Mac
split -l 100000 large.csv part_
→ 每部分分割成 100,000 行
✔ Windows (PowerShell 示例)
Get-Content large.csv -TotalCount 100000 > part_1.csv
✔ 分阶段导入的好处
- 部分失败后更容易重试
- 更容易定位错误位置
- 服务器负载更稳定
8.2 临时禁用索引和外键
导入过程中,索引更新往往成为瓶颈。
✔ 临时禁用索引
ALTER TABLE example_table DISABLE KEYS;
-- LOAD DATA
ALTER TABLE example_table ENABLE KEYS;
※ 主要针对 MyISAM。对于 InnoDB 效果有限。
✔ 禁用外键
SET FOREIGN_KEY_CHECKS=0;
-- import
SET FOREIGN_KEY_CHECKS=1;
8.3 控制 autocommit(加速)
SET autocommit=0;
-- LOAD DATA
COMMIT;
SET autocommit=1;
8.4 批量加载的推荐设置
SET UNIQUE_CHECKS=0;
SET FOREIGN_KEY_CHECKS=0;
SET AUTOCOMMIT=0;
导入后:
COMMIT;
SET UNIQUE_CHECKS=1;
SET FOREIGN_KEY_CHECKS=1;
SET AUTOCOMMIT=1;
⚠ 在生产环境中谨慎使用。
8.5 增加超时时间
SET GLOBAL net_read_timeout=600;
SET GLOBAL net_write_timeout=600;
8.6 暂存表策略(安全操作)
不要直接导入到生产表中,先使用验证表。
CREATE TABLE staging LIKE example_table;
LOAD DATA LOCAL INFILE 'file.csv' INTO TABLE staging;
验证后:
INSERT INTO example_table
SELECT * FROM staging;
✔ 最稳定的实际模式
- 加载到暂存表
- 检查行数
- 验证约束
- 应用到生产
- 保存日志
✔ 大型数据的结论
- 尽可能使用 CLI
- 分割导入
- 通过暂存
- 临时禁用约束
- 检查日志
这将使导入即使在数百万行时也保持稳定。
9. 常见问题解答(常见问题)
这里是对经常搜索的 MySQL 导入问题的快速、实用答案。
Q1. 我可以只从 CSV 导入特定列吗?
是的,可以。
你可以将不必要的列映射到变量(例如 @dummy)并忽略它们。
LOAD DATA LOCAL INFILE '/path/to/example.csv'
INTO TABLE example_table
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(id, @dummy, age);
如果你只想要某些列,请确保明确指定列顺序。
Q2. 如何将空白单元格视为 NULL?
使用 NULLIF()。
LOAD DATA LOCAL INFILE '/path/to/example.csv'
INTO TABLE example_table
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(name, @age)
SET age = NULLIF(@age,'');
这将空字符串 (”) 转换为 NULL。
Q3. 如何跳过头行?
IGNORE 1 LINES
示例:
LOAD DATA LOCAL INFILE '/path/to/example.csv'
INTO TABLE example_table
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 LINES;
Q4. 如何验证导入结果?
✔ 检查行数
SELECT COUNT(*) FROM example_table;
✔ 检查警告/错误
检查 MySQL 警告:
SHOW WARNINGS;
✔ 分阶段表策略(推荐)
先加载到分阶段表中,然后再应用到生产环境。
Q5. 哪种方法最快?
结论:
- CSV → LOAD DATA LOCAL INFILE(最快)
- 备份恢复 → mysql 命令
GUI 很方便,但 CLI 在速度和稳定性上更胜一筹。
Q6. 在 Windows 上出现换行符错误
这是由于换行符导致的。
Windows:
LINES TERMINATED BY '\r\n'
Linux / Mac:
LINES TERMINATED BY '\n'
Q7. 出现 secure_file_priv 错误
检查:
SHOW VARIABLES LIKE 'secure_file_priv';
解决方法:
- 将 CSV 放在允许的目录中
- 或使用
LOCAL
✔ FAQ 摘要
- 列映射 →
@dummy - NULL 转换 →
NULLIF - 跳过表头 →
IGNORE 1 LINES - 高速导入 →
LOAD DATA - 常见卡点 →
local_infile/secure_file_priv/ 编码
10. 总结
MySQL 导入起初可能看起来很复杂,但 一旦按目标组织,就非常直观。
让我们回顾一下最简捷的成功路径。
✔ 恢复 SQL 文件(.sql)
最快且最稳定的方式:
mysql -u user -p dbname < backup.sql
- 检查数据库是否存在
- 检查权限
- 推荐使用
utf8mb4编码
✔ 导入 CSV(快速)
基本语法:
LOAD DATA LOCAL INFILE '/path/to/file.csv'
INTO TABLE table_name
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;
关键点:
- Windows 换行符 →
\r\n - 空字符串 →
NULLIF() - 若失败,检查
local_infile
✔ 故障排查检查顺序
- 编码(推荐 utf8mb4)
SHOW VARIABLES LIKE 'local_infile';SHOW VARIABLES LIKE 'secure_file_priv';- 权限(SHOW GRANTS)
- 换行符
按此顺序,你可以解决大多数问题。
✔ 大数据集的黄金法则
- 使用 CLI
- 拆分导入
- 通过分阶段表进行导入
- 临时禁用外键/约束
- 检查日志
✔ 最终结论
- 备份恢复 → mysql 命令
- 高速 CSV 导入 → LOAD DATA LOCAL INFILE
- 小型一次性任务 → GUI
如果不确定,使用 CLI 是最稳妥的选择。
有了这些,你现在拥有了完整的 MySQL 导入知识体系。
在你的环境中尝试一下,构建稳定的运维工作流。


