mysqlimport 是 MySQL 数据库的数据导入工具 ,专门用于从文本文件(如 CSV、TSV 等格式)快速导入数据到 MySQL 表中。它实际上是 LOAD DATA INFILE 语句的命令行接口,提供了更便捷的批量数据导入方式。
📖 基本语法
bash
mysqlimport [选项] 数据库名 文本文件...
重要特性:
mysqlimport根据文件名 确定目标表名(去掉扩展名)。例如,文件users.txt将被导入到users表中。- 可以同时导入多个文件,每个文件对应一个表。
🎯 常用选项
| 选项 | 说明 |
|---|---|
-u, --user=用户名 |
连接数据库的用户名。 |
-p, --password[=密码] |
连接数据库的密码。 |
-h, --host=主机名 |
连接数据库的主机名。 |
-P, --port=端口号 |
连接数据库的端口号。 |
-S, --socket=套接字文件 |
用于连接的 Unix 套接字文件。 |
-c, --columns=列列表 |
指定要导入的列及其顺序,用逗号分隔。 |
-d, --delete |
导入前先清空目标表。 |
-f, --force |
遇到错误继续执行。 |
-i, --ignore |
如果导入的数据与已有数据有唯一键冲突,则忽略新数据。 |
-r, --replace |
如果导入的数据与已有数据有唯一键冲突,则替换已有数据。 |
-l, --lock-tables |
处理每个表前先锁定该表。 |
-L, --local |
从客户端读取文件(默认从服务器读取)。 |
--fields-terminated-by=字符串 |
指定字段分隔符(默认是制表符 \t)。 |
--fields-enclosed-by=字符 |
指定字段包围字符(如引号)。 |
--fields-optionally-enclosed-by=字符 |
指定字段可选的包围字符。 |
--fields-escaped-by=字符 |
指定转义字符(默认是反斜线 \)。 |
--lines-terminated-by=字符串 |
指定行终止符(默认是换行符 \n)。 |
--ignore-lines=N |
忽略文件开头的 N 行(通常用于跳过标题行)。 |
--default-character-set=字符集 |
指定文件的字符集(如 utf8, gbk)。 |
-v, --verbose |
详细模式,显示更多信息。 |
-V, --version |
显示版本信息。 |
-C, --compress |
启用客户端/服务器协议压缩。 |
-s, --silent |
静默模式,只输出错误信息。 |
💡 核心用法示例
1. 基本导入
bash
# 导入 CSV 文件到对应的表(文件名为 users.csv,对应 users 表)
mysqlimport -u root -p mydatabase users.csv
# 导入多个文件
mysqlimport -u root -p mydatabase users.csv orders.csv products.csv
2. 指定分隔符
bash
# 导入 CSV 文件(逗号分隔)
mysqlimport -u root -p --fields-terminated-by=',' mydatabase users.csv
# 导入 TSV 文件(制表符分隔)
mysqlimport -u root -p --fields-terminated-by='\t' mydatabase users.tsv
# 自定义分隔符
mysqlimport -u root -p --fields-terminated-by='|' mydatabase users.txt
3. 处理引号和转义
bash
# 字段用双引号包围
mysqlimport -u root -p --fields-enclosed-by='"' mydatabase users.csv
# 字段可选用双引号包围
mysqlimport -u root -p --fields-optionally-enclosed-by='"' mydatabase users.csv
# 自定义转义字符
mysqlimport -u root -p --fields-escaped-by='\\' mydatabase users.csv
4. 行终止符
bash
# Windows 格式的 CSV(回车+换行)
mysqlimport -u root -p --lines-terminated-by='\r\n' mydatabase users.csv
# Unix 格式(换行)
mysqlimport -u root -p --lines-terminated-by='\n' mydatabase users.csv
5. 导入选项
bash
# 导入前清空表
mysqlimport -u root -p --delete mydatabase users.csv
# 忽略重复记录
mysqlimport -u root -p --ignore mydatabase users.csv
# 替换重复记录
mysqlimport -u root -p --replace mydatabase users.csv
# 忽略标题行(跳过第一行)
mysqlimport -u root -p --ignore-lines=1 mydatabase users.csv
6. 指定列
bash
# 只导入部分列,并指定顺序
mysqlimport -u root -p --columns=id,name,email mydatabase users.csv
# 跳过文件中的某些列
mysqlimport -u root -p --columns=name,age,email mydatabase users.csv
🔧 高级用法
1. 从标准输入导入
bash
# 从管道导入
cat users.csv | mysqlimport -u root -p mydatabase -
# 注意:标准输入时,需要使用 `-` 作为文件名,且表名需要额外指定
2. 批量导入多个文件
bash
# 使用循环导入多个文件
for file in *.csv; do
mysqlimport -u root -p mydatabase "$file"
done
# 使用 xargs
find . -name "*.csv" -print0 | xargs -0 -I {} mysqlimport -u root -p mydatabase {}
3. 从压缩文件导入
bash
# 解压并导入
gzip -dc users.csv.gz | mysqlimport -u root -p mydatabase -
4. 远程导入
bash
# 从远程服务器导入
ssh user@remotehost "cat /path/to/data.csv" | mysqlimport -u root -p mydatabase -
# 导入到远程 MySQL 服务器
mysqlimport -h remote_host -u remote_user -p mydatabase data.csv
⚠️ 重要注意事项
-
文件位置 :默认情况下,
mysqlimport从服务器端 读取文件。如果使用--local选项,则从客户端读取文件。使用--local时,文件需要在运行mysqlimport命令的机器上。 -
权限要求:
- 如果使用服务器端读取,需要 MySQL 用户有
FILE权限,且文件需要在服务器上。 - 如果使用客户端读取(
--local),需要 MySQL 用户有INSERT权限。
- 如果使用服务器端读取,需要 MySQL 用户有
-
文件格式:确保文件格式与表结构匹配,否则导入会失败。
-
性能优化:导入大量数据时,可以考虑以下优化:
- 在导入前禁用索引
- 使用
--local减少网络传输 - 增大
max_allowed_packet参数
📊 示例:完整的 CSV 导入流程
假设有一个 users.csv 文件:
csv
id,name,email,age
1,John Doe,john@example.com,30
2,Jane Smith,jane@example.com,25
3,Bob Johnson,bob@example.com,35
步骤 1:创建表
sql
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100),
age INT
);
步骤 2:导入数据
bash
# 导入 CSV 文件(跳过标题行)
mysqlimport -u root -p --fields-terminated-by=',' --ignore-lines=1 mydatabase users.csv
🔍 与 LOAD DATA INFILE 对比
mysqlimport 实际上是 LOAD DATA INFILE 的包装。两者功能对应关系:
| 功能 | mysqlimport 选项 |
LOAD DATA INFILE 子句 |
|---|---|---|
| 字段分隔符 | --fields-terminated-by |
FIELDS TERMINATED BY |
| 字段包围字符 | --fields-enclosed-by |
FIELDS ENCLOSED BY |
| 行终止符 | --lines-terminated-by |
LINES TERMINATED BY |
| 忽略行 | --ignore-lines |
IGNORE n LINES |
| 替换重复记录 | --replace |
REPLACE |
| 忽略重复记录 | --ignore |
IGNORE |
等价示例:
bash
# mysqlimport
mysqlimport -u root -p --fields-terminated-by=',' --ignore-lines=1 mydatabase users.csv
# 对应的 LOAD DATA INFILE
mysql -u root -p -e "LOAD DATA INFILE 'users.csv' INTO TABLE users FIELDS TERMINATED BY ',' IGNORE 1 LINES" mydatabase
🛠️ 故障排除
1. 权限错误
bash
# 错误:The MySQL server is running with the --secure-file-priv option
# 解决方案:检查 secure_file_priv 设置
mysql -u root -p -e "SHOW VARIABLES LIKE 'secure_file_priv';"
# 如果设置了路径,将文件放在该路径下
# 或者修改配置文件 my.cnf
2. 字符编码问题
bash
# 指定正确的字符集
mysqlimport -u root -p --default-character-set=utf8 mydatabase users.csv
3. 字段不匹配
bash
# 查看表结构
mysql -u root -p -e "DESCRIBE users" mydatabase
# 调整导入列的顺序
mysqlimport -u root -p --columns=id,name,age,email mydatabase users.csv
4. 文件找不到
bash
# 使用 --local 从客户端读取
mysqlimport -u root -p --local mydatabase users.csv
📌 最佳实践
- 备份数据:在导入前备份目标表。
- 测试导入:先在小规模数据上测试导入命令。
- 使用事务:对于重要数据,可以在一个事务中导入,以便出错时回滚。
- 监控性能:导入大量数据时监控服务器性能。
mysqlimport 是一个非常高效的数据导入工具,特别适合批量导入格式化文本数据。掌握其用法可以大大提高数据迁移和处理的效率。