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的主要内容,如果未能解决你的问题,请参考以下文章

恢复 sql 转储文件时得到 errno 150

错误:无法写入数据:[Errno 32] Broken pipe (proc_open)

mysql_pconnect(): 发送 5 个字节失败,errno=32 Broken pipe

Errno 121,写入或更新时重复键?

mysqldump: Got error: 1135: Can't create a new thread (errno 11); if you are not out of availabl

C fopen 写入失败,errno 为 2