我现在已经苦苦挣扎了几天,一直试图在其他谷歌搜索中使用this线程来解决它但似乎无法让它发挥作用。
当我运行这个SELECT查询(Ubuntu Server 15.10& MySQL 5.6)...
时SELECT column1 ,column2
FROM table
INTO OUTFILE '/home/user/mysql_temp/file.csv';
我收到此权限错误...
ERROR 1 (HY000): Can't create/write to file '/home/mysql_temp/file.csv' (Errcode: 13 - Permission denied)
从我的搜索中,我理解这是系统权限问题而不是MySQL问题,但我似乎无法找到解决方案来解决它。
检查apparmor显示mysqld IS处于强制模式...
apparmor module is loaded.
6 profiles are loaded.
6 profiles are in enforce mode.
/sbin/dhclient
/usr/lib/NetworkManager/nm-dhcp-client.action
/usr/lib/NetworkManager/nm-dhcp-helper
/usr/lib/connman/scripts/dhclient-script
/usr/sbin/mysqld
/usr/sbin/tcpdump
0 profiles are in complain mode.
2 processes have profiles defined.
2 processes are in enforce mode.
/sbin/dhclient (676)
/usr/sbin/mysqld (1285)
0 processes are in complain mode.
0 processes are unconfined but have a profile defined.
所以我编辑了/etc/apparmor.d/usr.sbin.mysqld并添加了以下行,然后重新启动了apparmor ......
/home/user/mysql_temp/ rw,
/home/user/mysql_temp/* rw,
我还将所有者:mysql_temp组更改为mysql并赋予其完全权限...
sudo chown mysql:mysql mysql_temp
...
drwxrwxrwx 2 mysql mysql 6 Apr 1 22:02 mysql_temp
在此之后,我仍然收到同样的错误。
我错过了什么吗?误解了一些指令?将不胜感激。感谢。
答案 0 :(得分:0)
对我有用的是访问my.ini文件。在该文件中,查找"安全文件权限。"应该有一个文件路径,它是mySql赋予输出指定文件权限的安全路由。我希望这有帮助!对我来说,该文件位于C:/ ProgramData / mysql / mysql Server 5.7
下答案 1 :(得分:0)
基于解决方案;激活了Apparmor和MySql 8的Ubuntu 20.10
解决方案摘要和经验教训: 除非您有很好的理由不这样做
默认配置将secure-files-priv
设置为/var/lib/mysql-files
。保持原样,只要我给用户文件特权GRANT FILE ON *.* TO myuser@host;
但是,当我尝试写入该目录时,却遇到了令人恐惧的Error Code: 1. Can't create/write to file '/var/lib/mysql-files/select_out.csv' (OS errno 13 - Permission denied)
。我可以通过编辑/etc/apparmor.d/usr.sbin.mysqld
并进行更改
# Allow data files dir access
/var/lib/mysql-files/ r,
/var/lib/mysql-files/** rwk,
到
# Allow data files dir access
/var/lib/mysql-files/ rw,
/var/lib/mysql-files/** rwk,
但是当时我还不了解Apparmor,所以我摸索着搞砸了更多东西,直到找到@ spcurtis81的帖子。如果那是您的事,请继续阅读,也许您可以从我的旅程中学到一些东西。
不幸的是-我只知道为什么-我决定将secure-file-priv目录移动到/ mysql-files。这为我创造了更多的工作。如果没有别的,它教给我很多东西,并给了我分享的机会。
我不得不在[mysqld]
个文件中的.cnf
部分下更改'secure-files-priv'设置,但是该死的文件太多了。我是这样做的,
cd /
find . -name "*.cnf" -printf '%p\n' -exec grep "\[mysqld\]" {} \;
并获得
./conf.d/mysqldump.cnf
./conf.d/mysql.cnf
./my.cnf
./debian.cnf
./mysql.conf.d/mysqld.cnf
[mysqld]
./mysql.conf.d/mysql.cnf
./mysql.cnf
因此[mysqld]
上方的文件适合我。我发现了一些有关修改my.cnf
的参考,但是由于其中没有该节,因此我使用了mysqld.cnf。我还认为mysqld.cnf
是用于服务器守护程序的,而不是用于用户程序的。它起作用了,所以它并不愚蠢,但是也许一个知识渊博的人可以解释.cnf
文件的层次结构。
此设置没有现成的secure-files-priv
条目,因此我发现它似乎是一个合理的位置,并添加了以下内容。
# Added 12/13/2020 in an attempt to relocate the secure-file-priv directory
secure-file-priv = /mysql-files
不高兴。我发现另一个引用说您必须指定一个临时目录,因此我从同一文件中取消注释了这一行。
# If MySQL is running as a replication slave, this should be
# changed. Ref https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_tmpdir
tmpdir = /tmp
仍然没有喜悦。然后,我在这里找到@ spcurtis81的帖子,并了解了apparmor设置。所以在/etc/apparmor.d/usr.sbin.mysqld
中,我改变了
# Allow data files dir access
/var/lib/mysql-files/ r,
/var/lib/mysql-files/** rwk,
到
# Allow data files dir access
/mysql-files/ rw,
/mysql-files/** rwk,
并且仍然没有幸福感!
解决此问题的最后一步:chmod -R 700 /mysql-files
创建目录后,我将所有者设置为mysql并赋予其644权限。这似乎是合理的,但在我的mysql错误日志中增加了一个错误:'--secure-file-priv的配置不安全:所有OS用户均可访问该位置。考虑选择其他目录。'
我不喜欢安全警告,所以我将权限更改为600,从不认为mysql需要数据目录上的可执行权限。我错了。所以,你去了。
答案 2 :(得分:0)
不要忘记,您必须重新加载 apparmor
。
$ sudo service apparmor reload
答案 3 :(得分:0)
这是您存储数据的目录错误。
在您的案例中授予存储数据的文件夹的权限,即“mysql_temp”中的数据存储
使用命令“$ chmod 777 mysql_temp”
答案 4 :(得分:0)
如果 mysqld
包含在强制模式中,那么当 /var/log/messages
阻止写入/访问时,条目可以写入 AppArmor
。
您可以像这样编辑 /etc/apparmor.d/usr.sbin.mysqld
并在底部附近添加 /home/user/mysql_temp/
和 /home/user/mysql_temp/*
:
/usr/sbin/mysqld {
...
/var/log/mysql/ r,
/var/log/mysql/* rw,
/var/run/mysqld/mysqld.pid w,
/var/run/mysqld/mysqld.sock w,
**/home/user/mysql_temp/ r,
/home/user/mysql_temp/* rw,**
}
然后您可以让 AppArmor 重新加载配置文件。
# sudo /etc/init.d/apparmor reload
警告:上述更改将允许 MySQL
读取和写入 /home/user/mysql_temp/
目录。