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

相关推荐
qq_5425154118 分钟前
Ubuntu 22.04.4 LTS安装ToDesk最新版打不开,无响应?旧版本4.7.2_277版本分享
linux·ubuntu·todesk
火车叼位23 分钟前
替代 Tiny Win10 的 Linux 方案:Debian XFCE 精简桌面搭建
linux·运维
数据库小学妹30 分钟前
数据库连接池避坑指南:告别“连接超时”与“资源耗尽”,让系统跑得更快!
数据库·redis·sql·mysql·缓存·dba
小麦嵌入式35 分钟前
FPGA入门(四):时序逻辑计数器原理与 LED 闪烁实现
linux·驱动开发·stm32·嵌入式硬件·fpga开发·硬件工程·dsp开发
前进的李工1 小时前
EXPLAIN输出格式全解析:JSON、TREE与可视化
开发语言·数据库·mysql·性能优化·explain
达梦产品与服务1 小时前
稳扎稳打,持续迭代 | SQLark V3.10 更新,30+ 项优化与修复
mysql·oracle·达梦数据库·pg·sqlark百灵连接
皮卡蛋炒饭.2 小时前
传输层协议UDP
linux·网络协议·udp
大明者省2 小时前
宝塔开了端口,Ubuntu 还得开相应端口才能打通
服务器·数据库·ubuntu
syagain_zsx2 小时前
Linux指令初识(实用篇)
linux·运维·服务器
王木风2 小时前
终端里的编程副驾:DeepSeek-TUI-项目深度拆解,实测与原理分析
linux·运维·人工智能·rust·node.js