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

4

我已经苦苦挣扎了几天,一直试图使用这个线程以及其他谷歌搜索来解决问题,但似乎无法使其正常工作。

当我运行这个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的所有者:组为mysql,并给予它完全访问权限...
sudo chown mysql:mysql mysql_temp

...

drwxrwxrwx 2 mysql   mysql       6 Apr  1 22:02 mysql_temp

在此之后,我仍然收到相同的错误信息。
我错过了什么吗?是否误解了某些指示?感谢您的建议。谢谢。

对我有用的是访问my.ini文件。在该文件中,查找“Secure File Priv”。应该有一个文件路径,这是mySql授予输出指定文件权限的安全路线。希望这可以帮到你!对我来说,该文件位于C:/ProgramData/mysql/mysql Server 5.7下。 - Scott
7个回答

1
如果mysqld包含在强制模式中,则当AppArmor阻止写入/访问时,条目可以写入/var/log/messages
您可以编辑/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/目录。


0

将指定目录的所有权更改为mysql用户。

chown mysql:mysql /data/data-directory

0

别忘了,你必须重新加载 apparmor

$ sudo service apparmor reload

0

这是一个目录错误,您存储数据的位置有误。

给予存储数据的文件夹权限,在您的情况下,数据存储在 "mysql_temp" 中。

使用命令 "$ chmod 777 mysql_temp"。


0
我的解决方法是访问my.ini文件。在该文件中,查找“Secure File Priv”。应该有一个文件路径,这是mySql授予输出指定文件的安全路线。希望这可以帮到你!对我来说,该文件位于C:/ProgramData/mysql/mysql Server 5.7下。

0

原始问题是在此处编写到输出文件:

INTO OUTFILE '/home/user/mysql_temp/file.csv';

问题可能是mysql配置问题,而不是apparmor问题。

如果您正在使用systemd,请查看/etc/systemd/system/mysql.service中的此设置:

# Prevent accessing /home, /root and /run/user
ProtectHome=true

假设所有文件权限都正确,需要将其更改为false才能写入/home目录。

0

基于以下解决方案: Ubuntu 20.10,启用Apparmor和MySql 8

解决方案概述和经验教训: 除非你有充分的理由不这样做

  1. 保持默认的secure-file-priv设置不变,
  2. 在mysql中给你的用户FILE权限,
  3. 告诉apparmor允许写入mysql安装程序设置的默认目录。

默认配置将secure-files-priv设置为/var/lib/mysql-files。不改变它,默认情况下,只要我像这样授予用户文件权限,GRANT FILE ON *.* TO myuser@host;就能够在该目录中放置文件并导入它们。

但是,当我尝试写入该目录时,我遇到了可怕的错误代码:1。无法创建/写入文件'/var/lib/mysql-files/select_out.csv'(操作系统errno 13 - 权限被拒绝)。通过编辑/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下。这给我带来了更多的工作。至少它教会了我很多东西,并给了我分享的机会。

我必须在一个.cnf文件中的[mysqld]部分下更改"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,

AND 仍然没有任何进展!

解决问题的最后一步: chmod -R 700 /mysql-files

当我创建目录时,将所有者设置为 mysql 并授予它 644 权限。这似乎是合理的,但会在我的 mysql 错误日志中添加一个错误:“--secure-file-priv 的不安全配置:位置可被所有操作系统用户访问。请考虑选择其他目录。”

我不喜欢安全警告,所以我将权限更改为 600,从未想过 mysql 需要数据目录上的可执行权限。我错了。就是这样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接