SELECT INTO OUTFILE 无法写入文件

Posted

技术标签:

【中文标题】SELECT INTO OUTFILE 无法写入文件【英文标题】:SELECT INTO OUTFILE can't write to file 【发布时间】:2011-05-14 02:37:27 【问题描述】:

我正在尝试执行SELECT INTO OUTFILE,但出现以下错误:

General error: 1 Can't create/write to file '/home/jason/projects/mcif/web/downloads/dump.csv' (Errcode: 13). Failing Query: "
SELECT name
INTO OUTFILE '/home/jason/projects/mcif/web/downloads/dump.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
FROM account a

我知道问题可能是什么:我的 mysql 用户无法写入我的 downloads 文件夹。我不知道如何解决这个问题,原因有两个:

我不知道如何找出 MySQL 用户是 我不知道如何将 MySQL 用户添加到能够写入 downloads 文件夹的用户中

我在 Ubuntu Linux 上。有人可以帮我解决这两件事吗?

【问题讨论】:

这是托管环境吗? SQL是如何被调用的?如果它来自 Web 服务器,则用户很可能是 Web 服务器用来运行请求处理程序的任何东西。 如果您在 docker 容器中使用 MySQL,该文件也会输出到您的 docker 中。 【参考方案1】:

写入文件 /tmp/dump.csv 并将其复制过来。这会让你看到谁在运行什么。我的猜测是您是从网络上执行此操作的,并且客户端正在作为网络服务器进程运行......

【讨论】:

问题 #2 是标准的 unix 文件权限问题。您可以将您的目录设置为对 www-data 进行分组,并将 g+w 权限授予该目录。但这可能不是您想要做的,因为这将允许任何有权访问 Web 服务器的主体写入该目录。你从(php?,PERL?)调用这个。更好的选择是查看 suexex 或 suphp (我认为)。使脚本以您的用户身份运行... 我尝试了无数解决方案(更改 AppArmor、以 root 身份运行、chown 等),但只有这个有效。【参考方案2】:

mysql -u USERNAME --password=PASSWORD --database=DATABASE --execute='SELECT FIELD, FIELD FROM TABLE LIMIT 0, 10000 ' -X > file.xml

【讨论】:

【参考方案3】:

下面的讨论可能会有所帮助: How can I have MySQL write outfiles as a different user?

另外,请尽量避免用绒毛来混淆您的问题。在您的情况下,您已经知道这是一个权限问题,因此您的所有 SQL 连接和表都无关紧要。你可以简单地使用 您选择的一张表中的一个字段,用于演示问题而不会混淆。

【讨论】:

【参考方案4】:

客户可能是mysqld。您必须更改 apparmor 授权,它会正常工作。查看this answer

【讨论】:

以上是关于SELECT INTO OUTFILE 无法写入文件的主要内容,如果未能解决你的问题,请参考以下文章

select * into outfile 即使对于 root 也不起作用

MySQL select into outfile /tmp 没有输出

select … into outfile 备份恢复(load data)以及mysqldump时间对比

sqli-labs less7 GET - Dump into outfile - String (导出文件GET字符型注入)

翻译:select into outfile(已提交到MariaDB官方手册)

Mysql select into outfile 命令