使用CSV导入SingleStore(MemSQL)报ER_FILE_NOT_FOUND错误
ERROR 1017 ER_FILE_NOT_FOUND 排查与修复方案
核心触发原因
报错指向文件无法找到,90%以上的场景由三类问题导致:路径分隔符使用错误、文件权限/位置不匹配、分布式集群节点文件未同步。
排查步骤与对应修复
1. 修正路径分隔符错误
你当前使用的\home\vagrant\filename.csv是Windows系统的反斜杠路径格式,MemSQL/SingleStore部署的Linux虚拟机环境中,路径必须使用正斜杠/作为分隔符。反斜杠在SQL字符串中属于转义符,原写法会将\h/\v/\f识别为转义字符,完全无法匹配实际文件路径。
2. 校验文件实际位置与访问权限
登录虚拟机终端按顺序核对:
- 执行
ls -l /home/vagrant/filename.csv,确认文件真实存在于对应路径,排除文件名拼写错误、大小写不匹配、后缀名隐藏(比如实际是filename.csv.txt)、文件未复制成功等问题。 - 确认SingleStore运行用户对文件有读权限:SingleStore默认以
memsql系统用户运行,/home/vagrant目录默认是vagrant用户的私有目录,memsql用户默认无访问权限。可直接将文件移动到全局可读的/tmp目录下导入,或执行chmod o+r /home/vagrant/filename.csv给文件加全局读权限,若上级目录权限拦截还需执行chmod o+x /home/vagrant给目录加遍历权限。 - 若为分布式部署的SingleStore集群,普通
LOAD DATA INFILE语法会读取计算叶子节点本地的文件,而非你连接的聚合节点上的文件。如果仅把文件传到了聚合节点,所有叶子节点本地无对应文件,同样会报文件不存在。这种场景要么把文件同步到所有叶子节点的相同路径下,要么改用LOAD DATA LOCAL INFILE语法读取客户端本地文件。
3. 修正导入命令的语法问题
原命令存在标识符引用错误,修正后的参考命令如下:
LOAD DATA INFILE '/home/vagrant/filename.csv' INTO TABLE tableName FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'; -- 若CSV带表头行,在最后追加 IGNORE 1 LINES 跳过表头
注意不要用双引号包裹表名,SingleStore中字符串值用单引号包裹,标识符如需转义用反引号包裹,双引号在非ANSI模式下会被识别为字符串值,导致表匹配错误。
如果使用LOAD DATA INFILE持续报权限错误,可替换为LOAD DATA LOCAL INFILE语法,该语法会读取你执行SQL的客户端所在机器的文件,无需数据库服务端配置文件访问权限,仅需客户端连接时开启local_infile参数即可。
内容的提问来源于stack exchange,提问作者Zeeshan Ansari
相关产品推荐
相关产品推荐

