我有一个脚本试图使用 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 特殊对待,但为什么呢?我能想到的最接近的是手册中的一行:
For security reasons, when reading text files located on the server, the files must either reside in the database directory or be readable by all.
/tmp
不在数据库目录中,但也许它被视为在数据库目录中。那么我应该如何设置才能让它读取 /tmp
之外的文件呢?
最佳答案
mysqlimport --local <database> <infile>
或
LOAD DATA LOCAL INFILE... should fix the issue.
关于mysql - MySQL LOAD DATA INFILE 需要哪些文件和目录权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3971541/