0

Attempting to load a file into the DB.

CREATE TEMPORARY TABLE IF NOT EXISTS tt_emails (
    id INT PRIMARY KEY AUTO_INCREMENT,
    util_account_id VARCHAR(40) NULL,
    email VARCHAR(344) NOT NULL,
    optout INT NOT NULL
    );

LOAD DATA INFILE '/shared/implementation/emails.tsv'
    INTO TABLE tt_emails (util_account_id, email, optout);

The emails.tsv file has 3 columns, while the temporary table I made has 4. I'm not sure if this is correct syntax; I included a 4th column to have an id primary key column.

I get the following error when I run this code:

ERROR 13 (HY000): Can't get stat of '/nfs/shared/implementation/ngma/CO-48812_NGMA_Load_email/exclude_emails.tsv' (Errcode: 13)
4

1 回答 1

0

这是一个 unix/linux 文件系统权限问题。

操作系统不允许操作系统用户权限访问指定的文件。

文件路径中每个目录的权限必须至少为read+execute,文件本身的权限必须至少为read。

试图访问该文件的操作系统用户是 MySQL 服务器进程正在运行的 unix/linux 用户帐户。(这通常是“mysql”,但不一定是,这实际上取决于 MySQL 的安装和设置方式。

从 mysql 服务器主机上的 shell 提示符运行

ps -ef | grep mysqld

输出应包含包含 mysqld 的行。例如:

mysql      2247  1233  0 Mar21 ?    00:24:09 /opt/mysql/bin/mysqld --basedir=/opt/...

输出中的第一个字段显示 MySQL 服务器正在运行的操作系统用户。在这种情况下,它是操作系统用户“mysql”

如果我们以“mysql”身份登录操作系统,或者执行“su - mysql”切换到该用户),我们将在尝试访问该文件时遇到相同的权限问题。

/nfs/shared/implementation/ngma/CO-48812_NGMA_Load_email/exclude_emails.tsv

文件的权限不允许操作系统用户“mysql”读取文件,或者文件上方目录的权限不允许操作系统用户“mysql”“读取+执行”。

需要适当更改目录和文件的权限。


作为一个笨拙的解决方法,将文件复制到 /tmp (从 shell 提示符,以对文件具有“读取”权限的 OS 用户身份登录)。/tmp 目录应该允许所有人“读取+执行”,包括操作系统用户“mysql”

 cp /nfs/shared/implementation/ngma/CO-48812_NGMA_Load_email/exclude_emails.tsv /tmp/ 

然后您可以更改文件的权限以允许操作系统用户“mysql”读取文件。让每个人都可以阅读该文件:

 chmod ugo+r /tmp/exclude_emails.tsv

然后连接到 MySQL 服务器并尝试取消引用新 /tmp/exclude_emails.tsv 文件的 LOAD DATA。

当然,您的另一个选择是在原始文件上适当地设置权限(以便“mysql”用户(或任何运行 mysqld 的操作系统用户)具有必要的权限,以及路径中的所有目录。

总而言之……这不是一个真正的 MySQL 服务器问题。这是操作系统权限的问题,它禁止访问 mysql OS 用户尝试执行的文件。

于 2016-04-19T19:56:14.923 回答