Linux命令-mysqlimport(为MySQL服务器用命令行方式导入数据)

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

⚠️ 重要注意事项

  1. 文件位置 :默认情况下,mysqlimport服务器端 读取文件。如果使用 --local 选项,则从客户端读取文件。使用 --local 时,文件需要在运行 mysqlimport 命令的机器上。

  2. 权限要求

    • 如果使用服务器端读取,需要 MySQL 用户有 FILE 权限,且文件需要在服务器上。
    • 如果使用客户端读取(--local),需要 MySQL 用户有 INSERT 权限。
  3. 文件格式:确保文件格式与表结构匹配,否则导入会失败。

  4. 性能优化:导入大量数据时,可以考虑以下优化:

    • 在导入前禁用索引
    • 使用 --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

📌 最佳实践

  1. 备份数据:在导入前备份目标表。
  2. 测试导入:先在小规模数据上测试导入命令。
  3. 使用事务:对于重要数据,可以在一个事务中导入,以便出错时回滚。
  4. 监控性能:导入大量数据时监控服务器性能。

mysqlimport 是一个非常高效的数据导入工具,特别适合批量导入格式化文本数据。掌握其用法可以大大提高数据迁移和处理的效率。

相关推荐
Saniffer_SH2 小时前
【每日一题】一台可编程的PCIe 6.0主机 + 一套自动化CTS验证平台 + 一个轻量级链路分析系统
运维·服务器·测试工具·fpga开发·自动化·计算机外设·硬件架构
吕司2 小时前
Linux线程的概念
linux·运维·服务器
洛菡夕3 小时前
MySQL故障排查与生产环境优化
数据库·mysql
江西省遂川县常驻深圳大使3 小时前
openclaw.json配置示例
服务器·json·openclaw
gjc5923 小时前
零基础OceanBase数据库入门(4):创建MySQL模式数据库
数据库·mysql·oracle·oceanbase
飞Link3 小时前
深度掌控 Agent 调试:LangGraph 本地服务器与 Studio 核心指南
运维·服务器·jvm
古月方枘Fry3 小时前
三层交换+单臂路由+ACL网络配置
服务器·网络·智能路由器
驾驭人生3 小时前
ASP.NET Core 实现 SSE 服务器推送|生产级实战教程(含跨域 / Nginx / 前端完整代码)
服务器·前端·nginx
我科绝伦(Huanhuan Zhou)4 小时前
InnoDB Undo Log 深度解析:从原理到实现(基于 MySQL 8.0)
数据库·mysql