如何使用SELECT INTO OUTFILE写入/ tmp以外的目录?

时间:2013-12-09 20:05:07

标签: php mysql into-outfile

我正在尝试使用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。

我的设置

  • CentOS 6
  • PHP 5.3
  • MySQL 5.5
  • 使用Plesk控制面板的专用服务器
  • PHP作为Apache模块运行

我错过了什么?

1 个答案:

答案 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
相关问题