提问人:Tim Martin 提问时间:10/20/2010 更新时间:1/20/2014 访问量:18749
MySQL LOAD DATA INFILE 需要哪些文件和目录权限?
What file and directory permissions are required for MySQL LOAD DATA INFILE?
问:
我有一个脚本,它试图用 .出于某种原因,如果文件在目录中,则它有效,但如果文件位于具有相同权限的另一个目录中,则不起作用。我找不到任何方法可以让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
答:
如果您使用的是 Linux 服务器发行版(例如,RedHat Enterprise Linux 或 CentOS),则 Errno 13 可能是由于 SELinux 造成的。检查“audit.log”,看看SELinux是否在抱怨你的路径。然后,您可以添加路径 via 并运行 ./tmp2
semanage fcontext -a -t mysqld_db_t "/tmp2(/.*)?"
restorecon -R /tmp2
但是,解决方案可能要简单得多,如果我只知道如何回答,我会直接在您的问题下回答(而不是提供答案)。
评论
mysqlimport --local <database> <infile>
或
LOAD DATA LOCAL INFILE... should fix the issue.
评论
我遇到了类似的问题(无法读取文件)并在解决问题后添加。/tmp
LOCAL
LOAD DATA INFILE
此 Launchpad 错误报告可能会对发生这种情况的原因进行一些解释。
错误代码 13 表示缺少权限(与错误代码 2 相反,这意味着文件不存在)。MySQL需要任何人都可以读取该文件。您的文件权限很好。
我们曾经在 CentOS 服务器上遇到过同样的问题,它是由 AppArmor 引起的,它禁止 MySQL 应用程序访问未在 /etc/apparmor.d/usr 白名单中列出的文件。斌。mysqld。也许你有某种安全套装会导致类似的行为?
正如其他人所提到的,使用 LOAD DATA INFILE LOCAL 可能是一种解决方法。
评论
export TMPDIR=/tmp2
mysql
tmpdir