Errcode:将数据加载到SQL数据库时为13

时间:2016-04-19 19:08:20

标签: mysql mysql-loadfile

尝试将文件加载到数据库中。

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);

emails.tsv文件有3列,而我制作的临时表有4.我不确定这是否是正确的语法;我在第4列中添加了一个id主键列。

运行此代码时出现以下错误:

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

1 个答案:

答案 0 :(得分:0)

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

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

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

尝试访问该文件的OS用户是运行MySQL Server进程的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服务器的OS用户。在这种情况下,它是OS用户" mysql"

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

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

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

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

作为一个kludgy解决方法,将文件复制到/ 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"用户(或任何运行的OS用户mysqld)具有必要的权限,并且在所有路径中的目录。

总结一下......这不是MySQL服务器的问题。操作系统权限存在问题,禁止访问mysql OS用户尝试执行的文件。