MySQL LOAD DATA INFILE 需要哪些文件和目录权限?

What file and directory permissions are required for MySQL LOAD DATA INFILE?

提问人:Tim Martin 提问时间:10/20/2010 更新时间:1/20/2014 访问量:18749

问:

我有一个脚本,它试图用 .出于某种原因,如果文件在目录中,则它有效,但如果文件位于具有相同权限的另一个目录中,则不起作用。我找不到任何方法可以让MySQL从目录或数据库目录外部导入数据,但是我在手册中找不到任何解释为什么会这样的东西。LOAD DATA INFILE/tmp/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 表示权限问题。MySQL似乎特别对待它,但为什么呢?我能说到的最接近的是手册中的一句话:/tmp

出于安全原因,在读取位于服务器上的文本文件时,这些文件必须驻留在数据库目录中,或者可供所有人读取。

/tmp不在数据库目录中,但也许它会被视为在数据库中。那么我应该如何设置才能让它读取外部文件呢?/tmp

mysql 权限 load-data-infile

评论

0赞 Frédéric Hamidi 10/20/2010
如果你在跑步前会发生什么?export TMPDIR=/tmp2mysql
0赞 Tim Martin 10/20/2010
我不知道如何让MySQL使用我环境中的变量,但是如果我更改my.cnf中的值,它不会影响行为(tmp2仍然失败,即使它现在是临时目录)tmpdir
0赞 Joaquín L. Robles 8/26/2014
临时目录使用 LOAD DATA INFILE 节省了我的一天

答:

1赞 Joachim 10/20/2010 #1

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

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

评论

0赞 Tim Martin 10/20/2010
值得一提的是,我使用的是 Ubuntu 10.04 桌面版,从 Ubuntu 软件包安装了 MySQL。
0赞 Joachim 10/20/2010
好的,所以 SELinux 不是问题所在。您是否尝试过“LOAD DATA LOCAL INFILE ...”?它给你同样的结果吗?
17赞 Carl Sanders 12/2/2010 #2
mysqlimport --local <database> <infile>

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

评论

1赞 Unreason 12/2/2010
+1 没有本地 它在服务器进程的上下文中解析 - 因此您可以从客户端和服务器加载数据
2赞 David Locke 1/7/2011 #3

我遇到了类似的问题(无法读取文件)并在解决问题后添加。/tmpLOCALLOAD DATA INFILE

Launchpad 错误报告可能会对发生这种情况的原因进行一些解释。

3赞 Jan 2/1/2013 #4

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

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

正如其他人所提到的,使用 LOAD DATA INFILE LOCAL 可能是一种解决方法。

评论

0赞 Rich S 4/28/2022
试图做完全相同的事情,编辑 AppArmor 的 mysql 白名单文件解决了这个问题。谢谢