MySQL LOAD DATA LOCAL INFILE跨服务器(IP地址)使用失败求助
解决SQL服务器与文件服务器分离时MySQL LOAD DATA LOCAL INFILE的问题
我来帮你拆解这个问题——你现在的核心问题是跨服务器使用LOAD DATA LOCAL INFILE时,路径格式写错了,再加上对LOCAL参数的作用理解可能有偏差,咱们一步步来搞定:
1. 先纠正共享路径的格式问题
你原来写的//192.XXX.XX.XX/C:/repos/...是错误的Windows SMB共享路径格式。Windows系统里,磁盘的默认隐藏共享名是盘符+$(比如C盘的默认共享是C$),所以正确的路径应该把C:换成C$,修正后的路径是:
//192.XXX.XX.XX/C$/repos/example.com/web/matches/temp/20180218test08Y_PeopleInMatches.txt
2. 搞懂LOCAL参数的核心作用
别搞混LOCAL的含义:
LOAD DATA LOCAL INFILE:这里的LOCAL指的是MySQL客户端所在机器的本地文件,不是SQL服务器的本地文件。- 如果你的MySQL客户端(执行这条SQL的程序/命令行)是跑在文件服务器上:那用
LOCAL是对的,甚至可以直接用文件服务器的本地路径C:/repos/...,不用走共享。 - 如果你的客户端是跑在SQL服务器上:那
LOCAL会让客户端去SQL服务器本地找文件,这显然找不到。这时候有两个方案:- 把文件服务器的共享目录挂载到SQL服务器上(比如Windows映射成Z盘,Linux挂载成/mnt/share),然后用不带
LOCAL的LOAD DATA INFILE,直接用挂载后的本地路径。 - 确保SQL服务器能直接访问文件服务器的SMB共享,然后用修正后的共享路径+
LOCAL(因为客户端在SQL服务器,需要从共享拉取文件到客户端侧再上传)。
- 把文件服务器的共享目录挂载到SQL服务器上(比如Windows映射成Z盘,Linux挂载成/mnt/share),然后用不带
3. 必要的配置与权限检查
要让这个命令正常工作,还有几个关键配置要搞定:
- 开启MySQL的local_infile参数:
先在SQL命令行执行开启临时生效:
然后在MySQL的配置文件(my.cnf/my.ini)里添加SET GLOBAL local_infile = 1;local_infile=ON,避免重启后失效。 - 客户端连接时允许LOCAL:
如果用mysql命令行客户端,要加--local-infile=1参数启动;如果用编程语言的驱动(比如Python的mysql-connector),要在连接配置里开启allow_local_infile=True。 - 共享权限与防火墙:
- 文件服务器的
C$共享要给MySQL客户端所在机器的用户(比如SQL服务器的系统用户,或者运行客户端程序的账户)读取权限。 - 确保文件服务器的防火墙允许SMB端口(139、445)的入站访问,不然SQL服务器连不上共享目录。
- 文件服务器的
4. 正确的SQL语句示例
场景1:客户端在文件服务器上
直接用本地路径就行,简单高效:
LOAD DATA LOCAL INFILE 'C:/repos/example.com/web/matches/temp/20180218test08Y_PeopleInMatches.txt' INTO TABLE EventResultsSwimmersInSwims FIELDS TERMINATED BY ',' -- 替换成你实际的字段分隔符 OPTIONALLY ENCLOSED BY '"' -- 如果字段有引号包裹就加这行 LINES TERMINATED BY '\n' -- 替换成你实际的行分隔符 -- 这里可以加字段映射,比如 (@col1, @col2) SET id=@col1, name=@col2 ;
场景2:客户端在SQL服务器上(已挂载共享目录)
假设把文件服务器的C$共享映射成SQL服务器的Z盘:
LOAD DATA INFILE 'Z:/repos/example.com/web/matches/temp/20180218test08Y_PeopleInMatches.txt' INTO TABLE EventResultsSwimmersInSwims FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' ;
场景3:客户端在SQL服务器上(直接用SMB共享路径)
用修正后的共享路径:
LOAD DATA LOCAL INFILE '//192.XXX.XX.XX/C$/repos/example.com/web/matches/temp/20180218test08Y_PeopleInMatches.txt' INTO TABLE EventResultsSwimmersInSwims FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' ;
常见坑提醒
- 别把
LOCAL的方向搞反:很多人以为LOCAL是指文件服务器,其实是客户端所在机器。 - 如果MySQL是作为Windows服务运行的,要给服务账户配置访问文件服务器共享的权限,不然会报“权限不足”的错误。
- 大文件的话,挂载共享比直接用SMB路径更稳定,避免传输中断。
内容的提问来源于stack exchange,提问作者sjw0525
相关产品推荐
相关产品推荐

