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
它会写入一个文件。
我需要做什么才能允许 mysql
从 SELECT 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 权限,请执行以下操作:
service mysql restart --skip-networking --skip-grant-tables
mysql <hit enter>
UPDATE mysql.user SET File_priv = 'Y' WHERE user='lea' AND host='localhost';
exit
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 守护程序相同的用户对我有用。
我在尝试使用 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
它会写入一个文件。
我需要做什么才能允许 mysql
从 SELECT 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 权限,请执行以下操作:
service mysql restart --skip-networking --skip-grant-tables
mysql <hit enter>
UPDATE mysql.user SET File_priv = 'Y' WHERE user='lea' AND host='localhost';
exit
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 守护程序相同的用户对我有用。