mysqldump:在写入时得到 errno 32(1and1 共享主机)作为 crontab
Posted
技术标签:
【中文标题】mysqldump:在写入时得到 errno 32(1and1 共享主机)作为 crontab【英文标题】:mysqldump: got errno 32 on write (1and1 shared host) as crontab 【发布时间】:2011-07-19 18:43:30 【问题描述】:我正在使用 1and1 建议通过 mysqldump 备份 MySQL 数据库的确切代码 (http://faq.1and1.co.uk/archive/43.html)
$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。仍然没有运气。继续收到错误(写入时出现 errno 32)。
感谢任何帮助 - 这似乎是一个愚蠢的修复。
【问题讨论】:
【参考方案1】:如果您是通过 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 服务器而不是从命令行运行脚本。
【讨论】:
这使错误更有意义:errno 32 是“损坏的管道”,这意味着 gzip 在 mysqldump 完成输出之前退出。 gzip 失败是因为它无法写入输出文件,这听起来像是一个罪魁祸首。 @Charles 确实如此。在 DOCUMENT_ROOT 为空的情况下,gzip 将尝试写入/backup/...
,您非常希望普通用户没有权限这样做:)以上是关于mysqldump:在写入时得到 errno 32(1and1 共享主机)作为 crontab的主要内容,如果未能解决你的问题,请参考以下文章
错误:无法写入数据:[Errno 32] Broken pipe (proc_open)
mysql_pconnect(): 发送 5 个字节失败,errno=32 Broken pipe
mysqldump: Got error: 1135: Can't create a new thread (errno 11); if you are not out of availabl