【问题标题】:What file and directory permissions are required for MySQL LOAD DATA INFILE?MySQL LOAD DATA INFILE 需要哪些文件和目录权限?
【发布时间】:2011-04-27 15:47:47
【问题描述】:

我有一个脚本正在尝试使用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

我从论坛帖子中得知 errno 13 表明存在权限问题。好像/tmp被MySQL特别对待了,但是为什么呢?我能找到的最接近的是手册中的一句话:

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

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

【问题讨论】:

  • 如果你在运行mysql之前export TMPDIR=/tmp2会发生什么?
  • 我不知道如何让 MySQL 使用我的环境中的变量,但是如果我在 my.cnf 中更改 tmpdir 的值,它不会影响行为(tmp2 仍然失败,即使它现在是临时目录)
  • 临时目录使用 LOAD DATA INFILE 为我节省了一天

标签: mysql permissions load-data-infile


【解决方案1】:

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

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

【讨论】:

  • 不管怎样,我使用的是 Ubuntu 10.04 桌面版,从 Ubuntu 包中安装了 MySQL。
  • 好的,所以 SELinux 不是问题所在。您是否尝试过“加载数据本地文件...”?它会给你同样的结果吗?
【解决方案2】:
mysqlimport --local <database> <infile>

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

【讨论】:

  • +1 没有本地它在服务器进程的上下文中解析 - 因此您可以从客户端和服务器加载数据
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    Errcode 13 表示缺少权限(与 Errcode 2 相反,Errcode 2 表示文件不存在)。 MySQL 需要任何人都可以读取该文件。你文件的权限没问题。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      • 2012-10-05
      • 2010-11-17
      相关资源
      最近更新 更多