我有一个脚本,试图通过LOAD DATA INFILE
加载一些数据到MySQL中。出于某种原因,如果该文件位于/tmp
目录中,但该文件位于另一个具有相同权限的目录中,则该文件不起作用。我找不到任何方式让MySQL从/tmp
目录或数据库目录之外导入数据,但是我找不到手册中的任何内容来解释为什么会出现这种情况。MySQL LOAD DATA INFILE需要哪些文件和目录权限?
的情况:
$ ls -l/
...
drwxrwxrwt 21 root root 4096 2010-10-19 20:02 tmp
drwxrwxrwt 2 root root 4096 2010-10-19 20:14 tmp2
$ ls -l /tmp/data.csv
-rwxr-xr-x 1 timm timm 415431 2010-10-19 20:02 /tmp/data.csv
$ ls -l /tmp2/data.csv
-rwxr-xr-x 1 timm timm 415431 2010-10-19 20:14 /tmp2/data.csv
AFAICT这些都是重要的方面完全相同。但是,如果在MySQL命令行我做:
> LOAD DATA INFILE '/tmp2/data.csv' IGNORE INTO TABLE ports
FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY ' ';
ERROR 29 (HY000): File '/tmp2/data.csv' not found (Errcode: 13)
> LOAD DATA INFILE '/tmp/data.csv' IGNORE INTO TABLE ports
FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY ' ';
Query OK, 1 row affected, 1 warning (0.04 sec)
Records: 1 Deleted: 0 Skipped: 0 Warnings: 0
我从论坛发帖收集,errno 13表示权限问题。似乎/tmp
被MySQL特别对待,但为什么?我能来最接近的是手动说法一行:
出于安全原因,当读取位于服务器上的文本文件时,该文件必须驻留在数据库目录或者是所有可读。
/tmp
不在数据库目录中,但可能会将其视为好像被对待。那么我应该如何设置它才能读取/tmp
以外的文件?
如果您在运行mysql之前输出TMPDIR =/tmp2',会发生什么? – 2010-10-19 18:49:41
我不知道如何让MySQL使用我的环境中的变量,但是如果我在my.cnf中更改'tmpdir'的值,它不会影响行为(tmp2仍然会失败,即使它现在是temp目录) – 2010-10-20 05:39:15
临时目录使用LOAD DATA INFILE保存了我的一天 – 2014-08-26 01:23:35