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
文件夹。我不知道如何解决这个问题,原因有两个:
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字符型注入)