错误1(HY000):无法创建/写入文件(错误代码:13 - 权限被拒绝)

时间:2016-04-03 21:39:54

标签: mysql ubuntu permission-denied ubuntu-server

我现在已经苦苦挣扎了几天,一直试图在其他谷歌搜索中使用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

在此之后,我仍然收到同样的错误。

我错过了什么吗?误解了一些指令?将不胜感激。感谢。

5 个答案:

答案 0 :(得分:0)

对我有用的是访问my.ini文件。在该文件中,查找"安全文件权限。"应该有一个文件路径,它是mySql赋予输出指定文件权限的安全路由。我希望这有帮助!对我来说,该文件位于C:/ ProgramData / mysql / mysql Server 5.7

答案 1 :(得分:0)

基于解决方案;激活了Apparmor和MySql 8的Ubuntu 20.10

解决方案摘要和经验教训: 除非您有很好的理由不这样做

  1. 单独保留默认的安全文件专用设置,
  2. 在mysql中授予用户FILE权限,
  3. 并告诉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并进行更改

来轻松解决此问题
# 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/ 目录。