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

v09wglhw  于 2022-11-02  发布在  其他
关注(0)|答案(6)|浏览(259)

我已经挣扎了几天,现在这个,并一直试图使用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

在此之后,我仍然收到相同的错误。
我是不是错过了什么?误解了一些说明?如果能得到建议,我将感激不尽。谢谢。

quhf5bfb

quhf5bfb1#

对我有效的方法是访问my.ini文件。在该文件中,查找“Secure File Priv.”。应该有一个文件路径,该路径是mySql为输出指定文件提供权限的安全路径。我希望这对我有帮助!对我来说,该文件位于C:/ProgramData/mysql/mysql Server 5.7下

1sbrub3j

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并更改


# 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。这给我带来了更多的工作。如果没有别的,它教会了我很多,并给了我分享的机会。

我不得不改变'secure-files-priv'设置下的[mysqld]节在.cnf文件之一,但,有这么多该死的。我发现它这样做,

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的不安全配置:所有操作系统用户都可以访问该位置。请考虑选择其他目录。'
我不喜欢安全警告,所以我把权限改为600,从来没有想过mysql会需要数据目录的可执行权限。我错了。所以,你去吧。

6ljaweal

6ljaweal3#

这是一个目录错误,你存储的数据。
在您的情况下,将数据存储在“mysql_temp”中的文件夹的权限给予
请使用命令“$chmod 777 mysql_temp

ix0qys7i

ix0qys7i4#

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

$ sudo service apparmor reload
rryofs0p

rryofs0p5#

如果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/目录。

fkaflof6

fkaflof66#

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

chown mysql:mysql /data/data-directory

相关问题