Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SELECT INTO OUTFILE权限被拒绝,但用户可以写入目录_Mysql_Linux_Permissions - Fatal编程技术网

Mysql SELECT INTO OUTFILE权限被拒绝,但用户可以写入目录

Mysql SELECT INTO OUTFILE权限被拒绝,但用户可以写入目录,mysql,linux,permissions,Mysql,Linux,Permissions,我在尝试使用选择到OUTFILE和使用/tmp以外的目录时遇到问题 我的Linux用户名为datam,我的MySQL用户名为lea,MySQL作为MySQL运行 当datam运行mysql-u lea database并尝试执行路径为/home/datam/xfers/online/file.csv的选择到OUTFILE时,我得到一个错误代码13,权限被拒绝。使用/tmp/file.csv是可行的,因此我非常确信MySQL中的权限没有问题 我已将mysql添加到datam组中,并通过以下方式验证

我在尝试使用
选择到OUTFILE
和使用
/tmp
以外的目录时遇到问题

我的Linux用户名为
datam
,我的MySQL用户名为
lea
,MySQL作为
MySQL
运行

datam
运行
mysql-u lea database
并尝试执行路径为
/home/datam/xfers/online/file.csv
选择到OUTFILE
时,我得到一个错误代码13,权限被拒绝。使用
/tmp/file.csv
是可行的,因此我非常确信MySQL中的权限没有问题

我已将
mysql
添加到
datam
组中,并通过以下方式验证了这一点:

~$ sudo id mysql
uid=106(mysql) gid=114(mysql) groups=114(mysql),1001(datam)
我递归地将
/home/datam/
设置为775

如果我执行
sudo-umysql/bin/bash
并转到
/home/datam/xfers/online/
并执行
触摸文件
,它会写入一个文件

我需要做什么才能允许
mysql
将文件从
SELECT写入OUTFILE

我相信这不是围绕这个主题的其他问题的重复,因为我已经研究了它们,并遵循了它们的所有指示(在指向我想要的目录的所有目录上设置execute,设置GRANT FILE,等等)

MySQL用户
lea
授权:

+-----------------------------------------------------------------------------------------------------------+
| Grants for lea@localhost                                                                                  |
+-----------------------------------------------------------------------------------------------------------+
| GRANT FILE ON *.* TO 'lea'@'localhost' IDENTIFIED BY PASSWORD '*9BB439A3A652A9DAD3718215F77A7AA06108A267' |
| GRANT ALL PRIVILEGES ON `database`.* TO 'lea'@'localhost'                                    |
+-----------------------------------------------------------------------------------------------------------+

这可能是由mysql用户权限引起的

如前所述

要授予自己文件权限,请执行以下操作:

  • 服务mysql重启--跳过网络--跳过授权表
  • mysql
  • UPDATE mysql.user SET文件_priv='Y',其中user='lea'和host='localhost'
  • 退出
  • 服务mysql重启
  • linux用户可以编写一个文件。但是mysql服务可能会被apparmor阻止

    检查此文件:
    /etc/apparmor.d/usr.sbin.mysqld

    在此处添加您的项目文件夹:

    /usr/sbin/mysqld {
        [...]
        /home/datam/xfers/online/ r,
        /home/datam/xfers/online/* rw
        [...]
    }
    
    最后,做一个测试

    sudo /etc/init.d/apparmor reload
    

    在现代系统上,mariaDB和mysql安装了systemd支持。除此之外,它在/etc/systemd/system/mysql.service中有以下设置:

    阻止访问/home、/root和/run/user ProtectHome=true


    这就是阻止它在/home中写入的原因。

    我发现将目录的所有者更改为与mysql守护程序相同的用户对我有效。

    不过,用户确实拥有文件权限。正如我在问题中所说:
    使用/tmp/file.csv是有效的,所以我很有信心MySQL中的权限没有问题
    您尝试过吗?“由INTO-OUTFILE或INTO-DUMPFILE创建的任何文件都可由服务器主机上的所有用户写入。原因是MySQL服务器无法创建由其帐户下的用户以外的任何人拥有的文件。(出于此原因和其他原因,您不应以root用户身份运行mysqld。)因此,文件必须是全世界可写的,以便您可以操作其内容。”并且,拥有具有文件权限的mysql用户与尝试使用
    mysql
    operating system Account写入文件是不同的。我的上一次更新不适合添加注释。请看更新的回答肯定是应用护甲。谢谢在这种情况下,这并不是阻止它的原因,我已经接受了答案。你为从谷歌过来的人提供额外的信息是可以的,但是说这是我的问题是不正确的。你能解释一下为什么这些目录受到保护吗?我终于按照这里和这里的建议将MySQL导出到一个文件