【问题标题】:SELECT INTO OUTFILE permission denied but the user can write to the directorySELECT INTO OUTFILE 权限被拒绝,但用户可以写入目录
【发布时间】:2015-08-02 06:02:13
【问题描述】:

我在尝试使用SELECT INTO OUTFILE 和使用/tmp 以外的目录时遇到问题。

我的 Linux 用户名为 datam,我的 MySQL 用户名为 lea,MySQL 以 mysql 运行。

datam 运行mysql -u lea database 并尝试使用/home/datam/xfers/online/file.csv 的路径执行SELECT INTO OUTFILE 时,我收到错误代码13,权限被拒绝。使用 /tmp/file.csv 有效,所以我相当有信心这不是 MySQL 中的权限问题。

我已将mysql 添加到datam 组,并通过以下方式验证了这一点:

~$ sudo id mysql
uid=106(mysql) gid=114(mysql) groups=114(mysql),1001(datam)

我将 /home/datam/ 递归设置为 775。

如果我执行sudo -u mysql /bin/bash 并转到/home/datam/xfers/online/ 并执行touch file 它会写入一个文件。

我需要做什么才能让mysqlSELECT INTO OUTFILE 写入文件?

我相信这不是围绕这个主题的其他问题的重复,因为我已经查看了它们并遵循了他们的所有说明(在所有目录上设置执行,直到我想要的目录,设置 GRANT FILE ON 等)。

MySQL 用户lea 授予:

+-----------------------------------------------------------------------------------------------------------+
| Grants for lea@localhost                                                                                  |
+-----------------------------------------------------------------------------------------------------------+
| GRANT FILE ON *.* TO 'lea'@'localhost' IDENTIFIED BY PASSWORD '*9BB439A3A652A9DAD3718215F77A7AA06108A267' |
| GRANT ALL PRIVILEGES ON `database`.* TO 'lea'@'localhost'                                    |
+-----------------------------------------------------------------------------------------------------------+

【问题讨论】:

标签: mysql linux permissions


【解决方案1】:

这可能是mysql用户权限造成的。

如此处所述https://dba.stackexchange.com/questions/17029/cannot-output-mysql-data-to-file

要授予自己 FILE 权限,请执行以下操作:

  1. service mysql restart --skip-networking --skip-grant-tables
  2. mysql <hit enter>
  3. UPDATE mysql.user SET File_priv = 'Y' WHERE user='lea' AND host='localhost';
  4. exit
  5. service mysql restart

linux 用户可以写一个文件。但是mysql服务可能被apparmor屏蔽了。

检查此文件:/etc/apparmor.d/usr.sbin.mysqld

在那里添加你的项目文件夹:

/usr/sbin/mysqld {
    [...]
    /home/datam/xfers/online/ r,
    /home/datam/xfers/online/* rw
    [...]
}

最后,做一个

sudo /etc/init.d/apparmor reload

【讨论】:

  • 用户确实有文件权限。正如我的问题所述:Using /tmp/file.csv works, so I'm fairly confident it is not an issue with permissions within MySQL
  • 你试过了吗? " INTO OUTFILE 或 INTO DUMPFILE 创建的任何文件都可以被服务器主机上的所有用户写入。原因是 MySQL 服务器无法创建由运行它的帐户下的用户以外的任何人拥有的文件。 (由于这个原因和其他原因,您永远不应该以 root 身份运行 mysqld。)因此,该文件必须是全局可写的,以便您可以操作其内容。"
  • 拥有一个具有文件权限的mysql用户与尝试使用mysql操作系统帐户写入文件是不同的
  • 我的最新更新不适合评论。请查看更新的答案
  • 绝对是应用装甲。谢谢!
【解决方案2】:

在现代系统上,mariaDB 和 mysql 安装了 systemd 支持。除此之外,它在 /etc/systemd/system/mysql.service 中有这个设置:

阻止访问 /home、/root 和 /run/user

ProtectHome=true

这就是阻止它写入 /home 的原因。

【讨论】:

  • 在这种情况下,这并不是阻止它的原因,正如我已经接受答案所示。您为从 Google 光顾的人提供额外信息很好,但说这是我的问题是不正确的。
  • 你能解释一下为什么这些目录受到保护吗?
【解决方案3】:

我发现将目录的所有者更改为与 mysql 守护程序相同的用户对我有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 2017-08-05
    • 2013-12-27
    • 1970-01-01
    • 2015-01-21
    • 2015-09-23
    • 1970-01-01
    相关资源
    最近更新 更多