MySQL LOAD DATA INFILE需要什么文件和目录权限?

时间:2010-10-19 18:39:50

标签: mysql permissions load-data-infile

我有一个脚本尝试使用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

我从论坛帖子中收集到错误13表示权限问题。似乎/tmp被MySQL专门处理,但为什么呢?我能来的最接近的是手册中的一句话:

  

出于安全考虑,在读取位于服务器上的文本文件时,文件必须驻留在数据库目录中,或者所有文件都可以读取。

/tmp不在数据库目录中,但可能会被视为数据库目录。那么我该如何设置它以便读取/tmp之外的文件?

4 个答案:

答案 0 :(得分:16)

mysqlimport --local <database> <infile>

OR

LOAD DATA LOCAL INFILE... should fix the issue.

答案 1 :(得分:2)

答案 2 :(得分:1)

如果您使用的是Linux服务器发行版(例如,RedHat Enterprise Linux或CentOS),Errno 13可能是由SELinux引起的。检查'audit.log'以查看SELinux是否在抱怨您的/tmp2路径。然后,您可以通过semanage fcontext -a -t mysqld_db_t "/tmp2(/.*)?"添加路径并运行restorecon -R /tmp2

然而,解决方案可能会简单得多,如果我只知道如何,我会直接在你的问题下回答(而不是提供答案)。

答案 3 :(得分:1)

错误代码13表示缺少权限(与Errcode 2相反,这意味着该文件不存在)。 MySQL需要任何人都可以读取该文件。你的文件的权限很好。

我们曾经在CentOS服务器上遇到同样的问题,它是由 AppArmor 引起的,它禁止MySQL应用程序访问/etc/apparmor.d/usr中未列入白名单的文件。 sbin中。mysqld的。也许你有某种安全套装会导致类似的行为?

如其他人所述,使用LOAD DATA INFILE LOCAL 可以解决此问题。