我有一个脚本尝试使用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
之外的文件?
答案 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 可以解决此问题。