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