7

我有一个脚本试图将一些数据加载到 MySQL 中LOAD DATA INFILE。出于某种原因,如果文件在/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

我从论坛帖子中收集到 errno 13 表示权限问题。似乎/tmp是 MySQL 特殊对待的,但为什么呢?我能来的最接近的是手册中的一句话:

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

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

4

4 回答 4

16
mysqlimport --local <database> <infile>

或者

LOAD DATA LOCAL INFILE... should fix the issue.
于 2010-12-01T19:47:41.250 回答
2

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

这个Launchpad 错误报告可能对为什么会发生这种情况有一些解释。

于 2011-01-06T17:57:52.540 回答
2

Errcode 13 表示缺少权限(与 Errcode 2 不同,Errcode 2 表示文件不存在)。MySQL 需要任何人都可以读取该文件。您的文件的权限很好。

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

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

于 2013-02-01T09:26:58.820 回答
1

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

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

于 2010-10-19T18:51:06.590 回答