我正在尝试使用SELECT INTO OUTFILE将文件写入另一个目录中的自定义目录,该目录位于我的文档根目录之上一级。我可以写/ tmp所以我知道其他一切都在工作。
我正在使用文件的绝对完整路径。我可以用PHP创建目录和chmod到0777。目录已成功创建并且模式已正确设置(通过SSH和FTP查看)。
我想要使用的路径示例:
/var/www/vhosts/mysite/private_www/data_export/newdir/
我原以为只要目录是全局可读/可写/可执行的,MySQL就能写入它。但我仍然遇到这个错误。
无法创建/写入文件(错误代码:13)
我发现了很多有关此错误的帖子,但除以外的其他解决方案都没有写入/ tmp 。但是,如果我写入/ tmp,我必须添加更多代码来处理文件名,然后将文件复制到我想要的位置。
我认为可能我需要一条与MySQL不同的MySQL路径。有没有办法检查MySQL看到的服务器根目录?但是,我不确定这可能是问题,因为我能够使用相同的路径加载数据INFILE。
我的设置
我错过了什么?
答案 0 :(得分:1)
虽然您已在目标目录上正确设置了可写权限,但为了让用户将目录树遍历到该目标目录,您必须在每个更高目录上为该用户提供执行权限进入目标目录。这是因为在目录上下文中,执行实际上意味着查看内容以列出内容。
这意味着路径
中每个目录的最小值(忽略所有者/组权限)/var/www/vhosts/mysite/private_www/data_export
将为0751
,其中最终1
是“其他”用户类别的执行权限。因此,请验证目标路径中的每个目录是否至少具有MySQL服务器用户的执行权限(可能是CentOS系统中的mysql
)。
在所有这些目录上允许执行(list-contents)意味着任何系统用户都可以检查它们,而不仅仅是MySQL用户。在决定最终路径的位置时,请考虑这一点。如果可以,您可能希望将其与www文件分开。
在您的设置中,您已将目标目录设置为0777
,世界可读,全球可写。如果可以避免,这是不可取的。由于所有这些都是MySQL必须能够写入的,所以请考虑将其组所有权更改为mysql
组。这将使你能够避免使它成为世界可写的。
# Give group ownership to mysql
chown :mysql /var/www/vhosts/mysite/private_www/data_export/newdir
# And just make it writable by the group, not everyone
chmod 0770 /var/www/vhosts/mysite/private_www/data_export/newdir