使用mysqlimport进行纯文本数据导入

mysqlimport 是一个将以特定格式存放的纯文本数据导入到指定的MySQL Server 中的命令行工具,比如将一个标准的csv 文件导入到某指定数据库的指定表中。mysqlimport 工具实际上也只是“load data infile”命令的一个包装实现。在导入大型数据的时候,效率还是很高的。

1、mysqlimport基本语法

mysqlimport [options] db_name textfile1 [textfile2 ...]         #文件可以跟多个,大部分情况需尽量指定绝对路径,该命令会根据文件名(无视文件后缀名)导入到对应的表中

2、mysqlimport常用选项

选项释义
-l, –lock-tables写入时锁定所有表
-u, –user=name指定登入MySQL用户名
-p, –password[=name]指定用户密码,使用-p时密码与-p之间不允许有空格
-h, –host=name指定远程连接的服务器
-P,–port=#指定远程服务器所用的数据库短裤
-f, –force在导入某个数据文件出错时,跳过该文件,继续导入其他数据文件;并不会跳过单个文件中的某条错误数据
-i, –ignore在导入的数据与唯一键或主键冲突时,会忽略该条数据;在数据格式有误时,也会忽略错误强制插入
-r, –replace在导入的数据与唯一键或主键冲突时,会替换掉原数据
-d, –delete导入前,先清空被导入数据的表
-c, –columns=name往表里的指定字段导入数据,如:–columns=’Name,Age,Gender’
–ignore-lines=#忽略文本的前几行
-L, –local全部从客户端读取数据
–fields-enclosed-by=指定文本文件中数据的记录时以什么括起的,很多情况下数据以双引号括起。 默认的情况下数据是没有被字符括起的
–fields-terminated-by=指定各个数据的值之间的分隔符,在句号分隔的文件中, 分隔符是句号。默认的分隔符是跳格符(Tab)
–lines-terminated-by=指定行分隔符;默认是文本中的换行符

3、使用注意事项

  • 需对mysql服务的全局变量 secure_file_priv 进行设置:
    • 如果设置为空,则该变量无效。
    • 如果设置为目录的名称,服务器会将导入和导出操作限制为仅处理该目录中的文件。目录必须存在;服务器不会创建它。
    • 如果设置为NULL,服务器将禁用导入和导出操作。
  • 如果文本中的某一条数据和表结构不匹配,该命令会回滚,不会对该文本进行任何操作,即其他数据也不会导入。暂未找到合适的解决方法,可能需要在导入前确认数据格式。
  • local 选项不可用,说是我的版本不支持(mysql版本为8.0.16),在使用 load data infile 时,这个选项也不能用。
  • 还有许多关于ssl的连接方式,这里不做阐述
  • 使用mysql导入本地文件文件时提示”ERROR 1148 (42000): The used command is not allowed with this MySQL version”

  - 解决办法如下:
  
  - 服务器端:需要将local_infile这个全局变量设置为ON,登陆到MYSQL中后执行命令
  - 显示当前local_infile值为OFF,没有从本地载入文件权限 
  - 执行命令将其值改为ON 
  - set  global local_infile = 'on' ;
  - 改完后重新执行命令发现还是会提示错误,我们还需要在客户端启动的时候添加参数 
  - 客户端启动时加上--local-infile=1的参数,命令如下: 
  - mysql  -h ip -p3306 -u root -p --local-infile=1  -s 路径 /mysql/mysql.sock
  - 设置完成后即可从本地载入文件了