语法:
load data
[low_priority]
[local]
infile 'file_name'
[replace | ignore]
into table 'table_name'
[fields [terminated by 'char'] [OPTIONALLY] enclosed by 'char'] [escaped by 'char'] ]
[lines terminated by 'string']
[ignore number lines]
[(col_name, ...)]
其中:
low_priority 选项表示,MySQL将会等到没有其他人读这个表的时候,才把数据插入。
local选项表示,从客户端主机获取文件。如果不使用local,则在服务器端获取。
‘file_name’文件的路径可以是绝对路径,也可以是相对路径,相对路径是相对于mysql的根目录。
replace | ignore 选项,表示在发生唯一键冲突的时候的策略,是替换还是跳过
fields terminated by 'char' 可以指定字段之间的分隔符,默认情况下是tab字符(\t)
fields [OPTIONALLY] enclosed by 'char' 描述的是字段的括起字符。
fields escaped by 'char' 描述的转义字符。默认的是反斜杠: \
lines terminated by 'string' 指定每条记录的分隔符默认为"\n" 即为换行符
ignore n lines 指定忽略文件的前n行数据
col_name, ... 可以按指定的列把文件导入到数据库中
使用过程遇到的问题记录:
1.
Error Code: 1290. The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
如上描述,我们可以打开在mysql使用show variables like '%secure%' 查看mysql的secure_file_priv变量。
- secure_file_priv为null 表示不允许导入导出
- secure_file_priv指定文件夹时,表示mysql的导入导出只能发生在指定的文件夹
- secure_file_priv没有设置时,则表示没有任何限制
可以在mysql根目录下的my.ini中设置该变量为secure-file-priv=""
2.sql injection violation
如果你发现这个异常,并且 你的sql 在mysql执行没问题,就要考虑是不是druid防火墙把你sql拦截了,如果你配置了防火墙,可以关闭试试。将DataSource文件<property name="filters" value="stat,wall,log4j2"/> 中wall 去掉
3.no space left on device./ table 'Xxx' is full.
mysql在使用load data导入大量数据的时候,会产生大量bin_log日志,这时候你需要考虑是不是磁盘空间不足,或者日志文件太多。
4.Communicate Link failure.
sql timeout
在使用load data导入较大的文件的时候,可能会出现,由于mysql需要从客户端拉取待导入的文件到服务器端,可能是由于单个文件太大而导致的超时连接中断。可以尝试将大文件分成多个小文件进行导入
5.自增列
注意使用这种方式导入数据库时,自增列虽然时自增的,但是由于mysql不知道要导入多少条,所以往往导入之后自增列会跳空一段序号没有使用,比如自增列为10时,导入了一个文件100条,那么导入以后自增列增长可能不止100个,即可能>110了。