2010-10-19 142 views
7

我有一个脚本,试图通过LOAD DATA INFILE加载一些数据到MySQL中。出于某种原因,如果该文件位于/tmp目录中,但该文件位于另一个具有相同权限的目录中,则该文件不起作用。我找不到任何方式让MySQL从/tmp目录或数据库目录之外导入数据,但是我找不到手册中的任何内容来解释为什么会出现这种情况。MySQL LOAD DATA INFILE需要哪些文件和目录权限?

的情况:

$ 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特别对待,但为什么?我能来最接近的是手动说法一行:

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

/tmp不在数据库目录中,但可能会将其视为好像被对待。那么我应该如何设置它才能读取/tmp以外的文件?

+0

如果您在运行mysql之前输出TMPDIR =/tmp2',会发生什么? – 2010-10-19 18:49:41

+0

我不知道如何让MySQL使用我的环境中的变量,但是如果我在my.cnf中更改'tmpdir'的值,它不会影响行为(tmp2仍然会失败,即使它现在是temp目录) – 2010-10-20 05:39:15

+0

临时目录使用LOAD DATA INFILE保存了我的一天 – 2014-08-26 01:23:35

回答

1

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

然而,该解决方案可能会更简单,我就你的问题(而不是提供一个答案)下直接回答,如果我只知道..

+0

为了什么值得,我使用的是Ubuntu 10.04桌面版本,并且从Ubuntu软件包安装了MySQL。 – 2010-10-20 05:33:26

+0

好的,所以SELinux不是那里的问题。你有没有试过'LOAD DATA LOCAL INFILE ...'?它会给你同样的结果吗? – Joachim 2010-10-20 12:08:38

16
mysqlimport --local <database> <infile> 

OR

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

+1没有本地它在服务器进程的上下文中解决 - 所以你可以从客户端和服务器加载数据 – Unreason 2010-12-01 19:55:31

2

我遇到过类似问题(无法读取/tmp中的文件)并在LOAD DATA INFILE修复问题后加入LOCAL

这个Launchpad bug report可能有一些解释为什么会发生这种情况。

1

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

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

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