我已经挣扎了几天,现在这个,并一直试图使用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处于强制模式...
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的owner:group更改为mysql,并授予它完全权限...
sudo chown mysql:mysql mysql_temp
...
drwxrwxrwx 2 mysql mysql 6 Apr 1 22:02 mysql_temp
在此之后,我仍然收到相同的错误。
我是不是错过了什么?误解了一些说明?如果能得到建议,我将感激不尽。谢谢。
6条答案
按热度按时间quhf5bfb1#
对我有效的方法是访问my.ini文件。在该文件中,查找“Secure File Priv.”。应该有一个文件路径,该路径是mySql为输出指定文件提供权限的安全路径。我希望这对我有帮助!对我来说,该文件位于C:/ProgramData/mysql/mysql Server 5.7下
1sbrub3j2#
解决方案基于; Ubuntu 20.10,其中Apparmor处于活动状态,MySql 8处于活动状态
**解决方案摘要和经验教训:**除非您有充分的理由不这样做
1.保留默认的secure-file-priv设置,
1.在mysql中给予您的用户FILE权限,
1.并告诉Apparmor允许写入由MySQL安装程序设置的默认目录。
默认配置将
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
并更改至
但我当时并不知道apparmor,所以我摸索着搞砸了更多的东西,直到我发现了@spcurtis81的帖子。如果这是发生在你身上的事情,请继续阅读,也许你可以从我的旅程中学到一些东西。
不幸的是在某个时候--只有上帝知道为什么--我决定把secure-file-priv目录移到/mysql-files。这给我带来了更多的工作。如果没有别的,它教会了我很多,并给了我分享的机会。
我不得不改变'secure-files-priv'设置下的
[mysqld]
节在.cnf
文件之一,但,有这么多该死的。我发现它这样做,和获取
所以
[mysqld]
上面的文件是适合我的。我找到了几个修改my.cnf
的参考,但是因为它里面没有这个部分,所以我选择了mysqld. cnf。我还认为mysqld.cnf
是服务器守护进程的,而不是用户程序的。它工作正常,所以它不愚蠢,但是也许更有知识的人可以解释.cnf
文件的层次结构。这个设置没有
secure-files-priv
条目,所以我找到了一个合理的位置,并添加了以下内容。没有乐趣。我发现另一个参考说,你必须指定一个临时目录,所以我取消注解这一行从同一文件。
还是不高兴。然后我在这里找到了@spcurtis81的帖子,了解了apparmor的设置。所以在
/etc/apparmor.d/usr.sbin.mysqld
中我改变了至
还是没有他妈的快乐
解决问题的最后一步:
chmod -R 700 /mysql-files
个当我创建了这个目录后,我将所有者设置为mysql,并赋予它644个权限。这看起来很合理,但在mysql错误日志中添加了一个错误:'--secure-file-priv的不安全配置:所有操作系统用户都可以访问该位置。请考虑选择其他目录。'
我不喜欢安全警告,所以我把权限改为600,从来没有想过mysql会需要数据目录的可执行权限。我错了。所以,你去吧。
6ljaweal3#
这是一个目录错误,你存储的数据。
在您的情况下,将数据存储在“mysql_temp”中的文件夹的权限给予
请使用命令“$chmod 777 mysql_temp”
ix0qys7i4#
别忘了,你必须重新加载
apparmor
。rryofs0p5#
如果
mysqld
被包括在强制模式中,则当AppArmor
阻止写入/访问时,条目可以被写入/var/log/messages
中。您可以编辑
/etc/apparmor.d/usr.sbin.mysqld
并在底部附近添加/home/user/mysql_temp/
和/home/user/mysql_temp/*
,如下所示:然后您可以让AppArmor重新加载配置文件。
警告:以上更改将允许
MySQL
读取和写入/home/user/mysql_temp/
目录。fkaflof66#
将指定目录的所有权更改为mysql用户。