2011-03-21 36 views
3

我使用的1and1提出了通过mysqldump的备份的MySQL DB中的确切的代码(http://faq.1and1.co.uk/archive/43 .html)mysqldump的:上得了写错误号32(的1and1共享主机),为的crontab

$host= 'xxxx'; 
$user= 'xxxx'; 
$pass= 'xxxx'; 
$db= 'xxxx'; 

system(sprintf(
    'mysqldump --opt -h%s -u%s -p%s %s | gzip > %s/backup/' . time() . '.sql.gz', 
    $host, 
    $user, 
    $pass, 
    $db, 
    getenv('DOCUMENT_ROOT') 
)); 

已将所有权限更改为777以进行测试。仍然没有运气。继续得到错误(写入时错误32)。

任何帮助表示赞赏 - 这看起来像一个愚蠢的修复。

回答

4

如果你从一个cron作业这样做,那么DOCUMENT_ROOT将不存在。 DOCUMENT_ROOT和其他$_SERVER变量由Web服务器有效设置(请参阅the $_SERVER manual page),如果您直接从cron运行脚本,则不涉及Web服务器。请参阅this earlier, similar question

尝试设置相对于PHP脚本位置的备份目录路径。例如,如果你的脚本是在.../your_folder/scripts/backup_script.php,你的(预创建的)备份目录是.../your_folder/backup/,然后

$backup_dir = dirname(__FILE__) . '/../backup'; 

...然后用$backup_dir代替getenv('DOCUMENT_ROOT')

它看起来像你的主机的指令是正确的,但前提是运行在Web服务器脚本,而不是通过命令行。

+1

这使得错误更有意义:errno 32是“断开的管道”,这意味着gzip在mysqldump完成输出之前退出。 gzip因为无法写入输出文件而摔倒,听起来像是一个好罪魁祸首。 – Charles 2011-03-21 16:28:26

+0

@Charles确实。在DOCUMENT_ROOT为空的情况下,gzip将尝试写入'/ backup/...',您非常希望普通用户无权执行:) – 2011-03-21 16:32:18

+0

非常感谢 - 此工作! – psarid 2011-03-22 15:22:07