【问题标题】:SELECT INTO OUTFILE can't write to fileSELECT INTO OUTFILE 无法写入文件
【发布时间】: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 中。

标签: mysql sql linux into-outfile


【解决方案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

      【讨论】:

        猜你喜欢
        • 2014-10-04
        • 2012-12-31
        • 2011-02-21
        • 2013-03-24
        • 1970-01-01
        • 1970-01-01
        • 2013-12-27
        • 1970-01-01
        • 2020-02-24
        相关资源
        最近更新 更多