MySQL使用LOAD DATA导入数据
基础语法:
1 |
|
Local
: 从本地客户端读取文件,需要服务端和客户端同时开发权限,设置local_infile=ON
REPLACE
: 使用文件key
匹配的行替换数据库中数据,执行结果表现为deleted xx
IGNORE
:忽略主键冲突的数据,如果使用Local
时,未指定REPLACE
和IGNORE
的时候,效果等同于IGNORE
TERMINATED BY
:定义属性FIELDS
或行LINES
终止字符,例如:\n
ENCLOSED BY
:定义属性FIELDS
被什么字符包括,例如:"张三"
解析以后只存储张三
IGNORE
:忽略number
行,如果输入文件存在表头时,可以通过IGNORE
自动忽略SET
对输入内容进行格式转换处理,例如日期字符串格式化转换- 在字段行定义变量,例如 @timestamp
SET
位置引用变量,并设置字段值,SET birtyday = STR_TO_DATE(@timestamp, '%Y-%m-%d %H:%i:%s')
使用示例:
1 |
|
1 |
|
1 |
|
问题:
1、ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
问题原因:
从MySQL
服务器读取文件,文件不在MySQL
服务允许的路径,可以通过 show variables like 'secure_file_priv';
查看路径
解决方式:
- 将文件转移到
MySQL
服务权限路径下执行 - 禁用
secure_file_priv
,在/etc/my.cnf
文件中添加secure_file_priv=''
(在[mysqld]
下) - 自定义
secure_file_priv
文件路径,自定义的路径需要对mysql
用户授予权限,否则在服务启动或者LOAD DATA
时提示ERROR 13 (HY000)
2、ERROR 3948 (42000): Loading local data is disabled; this must be enabled on both the client and server sides
问题原因:
使用LOAD DATA
时,服务端和客户端未授予相关权限
解决方式:
- 服务端:
- 会话级:
set global local_infile='ON';
- 永久生效:
/etc/my.cnf --> [mysqld] --> local_infile=ON
- 会话级:
- 客户端:
mysql --local-infile=1
参考文档:
https://dev.mysql.com/doc/refman/8.0/en/load-data.html
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_secure_file_priv
MySQL使用LOAD DATA导入数据
https://probiecoder.cn/mysql/load_data.html