如何从远程服务器加载具有“MySQL LOAD FILE”功能的文件?
答案 0 :(得分:1)
正如LOAD DATA
手册中所述,您可以使用LOCAL
关键字:
LOCAL
关键字(如果已指定)将根据连接的客户端进行解释:
如果指定了
LOCAL
,则客户端主机上的客户端程序将读取该文件并将其发送到服务器。该文件可以作为完整路径名提供,以指定其确切位置。如果以相对路径名的形式给出,则相对于启动客户端程序的目录解释名称。将
LOCAL
与LOAD DATA
一起使用时,会在服务器的临时目录中创建该文件的副本。这不是由tmpdir
或slave_load_tmpdir
的值确定的目录,而是操作系统的临时目录,并且不能在MySQL服务器中配置。 (通常,系统临时目录在Linux系统上为/tmp
,在Windows上为C:\WINDOWS\TEMP
。)此目录中的副本缺少足够的空间可能导致LOAD DATA LOCAL
语句失败。如果未指定
LOCAL
,则该文件必须位于服务器主机上,并由服务器直接读取。服务器使用以下规则来查找文件:
如果文件名是绝对路径名,则服务器将其用作给定的。
如果文件名是具有一个或多个主要组件的相对路径名,则服务器将搜索相对于服务器数据目录的文件。
如果给出没有前导组件的文件名,服务器将在默认数据库的数据库目录中查找该文件。
请注意,在非
LOCAL
的情况下,这些规则意味着从服务器的数据目录中读取名为./myfile.txt
的文件,而读取名为myfile.txt
的文件从默认数据库的数据库目录。例如,如果db1
是缺省数据库,则以下LOAD DATA
语句从data.txt
的数据库目录中读取文件db1
,即使该语句明确将文件加载到db2
数据库中的表:LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;
使用正斜杠而不是反斜杠指定Windows路径名。如果你使用反斜杠,你必须加倍。
出于安全考虑,在读取位于服务器上的文本文件时,这些文件必须驻留在数据库目录中,或者所有文件都可以读取。此外,要在服务器文件上使用
LOAD DATA INFILE
,您必须具有FILE
权限。见Section 6.2.1, “Privileges Provided by MySQL”。对于非LOCAL
加载操作,如果secure_file_priv
系统变量设置为非空目录名,则要加载的文件必须位于该目录中。使用
LOCAL
比让服务器直接访问文件要慢一些,因为文件的内容必须由客户端通过连接发送到服务器。另一方面,您不需要FILE
权限来加载本地文件。使用
仅当您的服务器和客户端都已配置为允许时,LOCAL
时,默认的重复键处理行为与指定IGNORE
的行为相同;这是因为服务器无法在操作过程中停止传输文件。IGNORE
将在本节后面进一步解释。
LOCAL
才有效。例如,如果使用mysqld
启动--local-infile=0
,则LOCAL
不起作用。请参阅Section 6.1.6, “Security Issues withLOAD DATA LOCAL
”。