Mysql之“load data”学习
2023-04-22
Mysql使用load data 来进行数据导入,本文给出我在测试Mysql导入时的一些收获
load data 官网用法
可参考: https://dev.mysql.com/doc/refman/8.0/en/load-data.html
LOAD DATA
[LOW_PRIORITY | CONCURRENT] [LOCAL]
INFILE '_file_name_'
[REPLACE | IGNORE]
INTO TABLE _tbl_name_
[PARTITION (_partition_name_ [, _partition_name_] ...)]
[CHARACTER SET _charset_name_]
[{FIELDS | COLUMNS}
[TERMINATED BY '_string_']
[[OPTIONALLY] ENCLOSED BY '_char_']
[ESCAPED BY '_char_']
]
[LINES
[STARTING BY '_string_']
[TERMINATED BY '_string_']
]
[IGNORE _number_ {LINES | ROWS}]
[(_col_name_or_user_var_ [, _col_name_or_user_var_] ...)]
[SET _col_name_={_expr_ | DEFAULT} [, _col_name_={_expr_ | DEFAULT}] ...]
介绍
LOAD DATA
语法用于读取文件的行到表中,速度很快。它相当于是SELECT ... INTO OUTFILE
的反向过程。mysqlimport 也可以作为导入的方法,它的原理是将LOAD DATA
语句发到服务端。
本地vs非本地操作(Non-LOCAL Versus LOCAL Operation)
使用了LOCAL
修饰符,会有以下影响:
- 输入文件的预期位置会变成客户端(而不是服务端的文件系统路径)
- 更高的安全要求:因为可以直接读取客户端的文件,所以需要用户具有
SUPER
或FILE
权限 - 与
IGNORE
修饰符有同样的错误处理效果,即遇到重复键问题,不会报错只会记录警告信息 需要注意的是,LOCAL
参数必须在客户端和服务端都配置了才能生效。例如,可以在etc/mysql/my.cnf
中添加:
[mysql]
local-infile=1
[mysqld]
local-infile=1
[mysql] and [mysqld]
分别是客户端和服务端配置,区别主要如下:
[mysql]
部分用于配置MySQL客户端工具(例如mysql命令行客户端)的默认选项,如默认主机、端口号、用户、密码、使用的默认字符集等。[mysqld]
部分用于配置MySQL服务器的运行时选项,如监听的IP地址和端口号、数据目录位置、日志文件设置、缓存大小设置、连接数限制等。
上述方法是设置默认的local-infile=1
。一般是重启mysql生效。但需要注意的是,这里的“重启生效”仅针对服务端的设置(即[mysqld]
的设置)。对于客户端([mysql]
)的设置,无需重启,只需重新打开客户端连接到mysql服务,即可生效。
还有以下方法可以分别进行客户端和服务端的设置,如: 1、当前客户端会话开启:
mysql --local-infile=1 -u username -p
2、设置全局变量local_infile(服务端)
SHOW GLOBAL VARIABLES LIKE 'local_infile';
SET GLOBAL local_infile = 'ON';
SHOW GLOBAL VARIABLES LIKE 'local_infile';
需要注意的是,这种服务端设置会立刻生效,无需像在my.cnf中配置需要重启生效。但是这种方法只会对当前运行的 MySQL 实例生效,并且在 MySQL 实例重启后会丢失。
因此,如果想要长久的客户端和服务端local_infile
参数的设置,需要在配置文件my.cnf
中设置。如果仅需要当前客户端会话或当前服务实例生效,可采取下面的设置方法。