【发布时间】:2011-04-27 15:47:47
【问题描述】:
我有一个脚本正在尝试使用LOAD DATA INFILE 将一些数据加载到 MySQL 中。出于某种原因,如果文件位于 /tmp 目录中,则它可以工作,但如果文件位于具有相同权限的另一个目录中,则不会。我找不到任何方法让 MySQL 从/tmp 目录或数据库目录之外导入数据,但我在手册中找不到任何解释为什么会这样的内容。
情况:
$ 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之前export TMPDIR=/tmp2会发生什么? -
我不知道如何让 MySQL 使用我的环境中的变量,但是如果我在 my.cnf 中更改
tmpdir的值,它不会影响行为(tmp2 仍然失败,即使它现在是临时目录) -
临时目录使用 LOAD DATA INFILE 为我节省了一天
标签: mysql permissions load-data-infile