MySQL LOAD DATA INFILE需要什么文件和目录权限?

Tim*_*tin 7 mysql permissions load-data-infile

我有一个脚本试图将一些数据加载到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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我从论坛帖子中收集到,错误13表示权限问题.它似乎/tmp是由MySQL专门处理的,但为什么呢?我能来的最接近的是手册中的一句话:

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

/tmp不在数据库目录中,但它可能会被视为是.那么我应该怎样设置它以便读取文件以外的文件/tmp

小智 17

mysqlimport --local <database> <infile>
Run Code Online (Sandbox Code Playgroud)

要么

LOAD DATA LOCAL INFILE... should fix the issue.
Run Code Online (Sandbox Code Playgroud)


Joa*_*him 1

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

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