首页 >> 工具知识

mysql命令-mysqlimport

概述

mysqlimport 是 MySQL 提供的一个命令行工具,用于将文本文件(如 CSV、TSV 等格式)的数据快速导入到 MySQL 数据库中。它实际上是 LOAD DATA INFILE 语句的命令行接口。

基本语法

mysqlimport [选项] 数据库名 文本文件1 [文本文件2 ...]

主要特点

  1. 批量导入:高效地将大量数据导入数据库

  2. 文件与表映射:文件名(不含扩展名)对应目标表名

  3. 多文件支持:可以一次导入多个文件到不同的表

常用选项详解

连接选项

-u, --user=用户名           # 指定用户名
-p, --password[=密码]      # 指定密码(使用=或不带=)
-h, --host=主机名          # 连接的主机
-P, --port=端口号          # 连接端口
--protocol=协议           # 连接协议(tcp, socket, pipe等)

导入控制选项

--ignore                  # 忽略重复键错误,继续导入
--replace                 # 替换重复键的记录
--delete                  # 导入前清空目标表
--local                   # 从客户端读取文件(默认从服务器)
-L, --lock-tables         # 导入前锁定所有表
--low-priority            # 使用低优先级插入
--force                   # 即使遇到错误也继续执行
--silent, -s             # 静默模式,减少输出
--verbose, -v            # 详细模式

文件格式选项

--fields-terminated-by=字符串  # 字段分隔符(默认:\t)
--fields-enclosed-by=字符      # 字段包围符(默认:无)
--fields-optionally-enclosed-by=字符 # 可选字段包围符
--fields-escaped-by=字符      # 转义字符(默认:\\)
--lines-terminated-by=字符串   # 行终止符(默认:\n)
--columns=列名列表           # 指定要导入的列及顺序
--ignore-lines=N            # 忽略前N行(如标题行)

使用示例

基本示例

# 导入CSV文件到testdb数据库的employees表
# 文件名必须是 employees.txt 或 employees.csv
mysqlimport -u root -p testdb employees.csv

# 指定分隔符为逗号
mysqlimport -u root -p --fields-terminated-by=',' testdb employees.csv

# 忽略标题行(第一行)
mysqlimport -u root -p --ignore-lines=1 --fields-terminated-by=',' testdb employees.csv

复杂示例

# 导入CSV文件,指定列的顺序
mysqlimport -u root -p \
  --columns=id,name,email,hire_date \
  --fields-terminated-by=',' \
  --fields-enclosed-by='"' \
  --lines-terminated-by='\r\n' \
  --ignore \
  testdb employees.csv

# 从客户端导入本地文件
mysqlimport -u root -p \
  --local \
  --fields-terminated-by='|' \
  --lines-terminated-by='\n' \
  --verbose \
  testdb sales.txt

批量导入多个文件

# 导入orders.txt到orders表,customers.txt到customers表
mysqlimport -u root -p testdb orders.txt customers.txt

文件命名规则

mysqlimport 要求文本文件的基本名(不含扩展名)必须与目标表名一致:

  • employees.csv → employees 表

  • orders_2023.txt → orders_2023 表

  • customer_data.csv → customer_data 表

注意事项

1. 权限要求

-- 需要文件权限(如果使用--local选项则不需要)
GRANT FILE ON *.* TO '用户名'@'主机';

2. 安全性考虑

# 使用--local选项从客户端读取文件(更安全)
mysqlimport --local -u root -p testdb data.txt

# 避免在命令行直接写密码
mysqlimport -u root -p testdb data.txt
# 然后交互式输入密码

3. 常见问题处理

# 错误:Table 'xxx' doesn't exist
# 解决方案:确保表已存在且文件名正确

# 错误:Access denied for user
# 解决方案:检查用户权限,特别是FILE权限

# 错误:The MySQL server is running with --secure-file-priv
# 解决方案:将文件放在允许的目录或修改服务器配置

4. 性能优化

# 导入前禁用索引
ALTER TABLE 表名 DISABLE KEYS;
# 导入后重建索引
ALTER TABLE 表名 ENABLE KEYS;

# 使用扩展插入(mysqlimport自动处理)
# 调整bulk_insert_buffer_size
SET bulk_insert_buffer_size = 1024 * 1024 * 64;

与LOAD DATA INFILE对比

特性mysqlimportLOAD DATA INFILE
使用方式命令行工具SQL语句
多文件导入支持不支持
灵活性较低更高
错误处理有限选项完整控制
脚本集成适合shell脚本适合存储过程

实用技巧

1. 日志记录

# 记录导入过程
mysqlimport -u root -p --verbose testdb data.txt 2>&1 | tee import.log

2. 进度监控

# 使用pv工具显示进度
pv data.txt | mysqlimport -u root -p testdb /dev/stdin

3. 预处理数据

# 使用sed预处理数据
sed '1d' original.csv | mysqlimport -u root -p testdb /dev/stdin

4. 从压缩文件导入

# 解压并导入
gunzip -c data.csv.gz | mysqlimport -u root -p --fields-terminated-by=',' testdb /dev/stdin

示例配置文件

# ~/.my.cnf 配置连接参数
[mysqlimport]
user=myuser
password=mypassword
host=localhost
port=3306
local=1

最佳实践

  1. 始终备份:导入前备份目标表

  2. 测试导入:先用少量数据测试格式

  3. 检查编码:确保文件编码与数据库一致

  4. 使用事务:大文件导入考虑使用事务

  5. 监控资源:大型导入时监控服务器资源

常见错误代码

错误 1045: 访问被拒绝
错误 1148: 命令不允许
错误 1261: 行格式不正确
错误 1290: --secure-file-priv选项限制
错误 1062: 重复键值

通过合理使用 mysqlimport,可以高效地将文本数据导入 MySQL 数据库,特别适合批量数据迁移和ETL处理场景。


最新文章
mysql命令-mysqlimport2026-02-01
mysql命令-mysql_tzinfo_to_sql2026-02-01
mysql命令-mysql2026-02-01
mysql命令-my_print_defaults2026-02-01
mysql命令-mysqldumpslow2026-02-01
mysql命令-mysqld2026-02-01
mysql命令-mysql_secure_installation2026-02-01
mysql命令-myisampack2026-02-01
mysql命令-perror2026-02-01
mysql命令-mysqldump2026-02-01
备案号:蜀ICP备2023042032号-1