SELECT INTO OUTFILE 权限被拒绝,但用户可以写入目录

SELECT INTO OUTFILE permission denied but the user can write to the directory

我在尝试使用 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 用户权限引起的。

如此处所述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

在现代系统上,mariaDB 和 mysql 安装时支持 systemd。除其他事项外,它在 /etc/systemd/system/mysql.service:

中具有此设置

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

ProtectHome=true

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

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