【问题标题】:mysqldump: got errno 32 on write (1and1 shared host) as crontabmysqldump:在写入时得到 errno 32(1and1 共​​享主机)作为 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)。

感谢任何帮助 - 这似乎是一个愚蠢的修复。

【问题讨论】:

    标签: php mysql hosting mysqldump


    【解决方案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/...,您非常希望普通用户没有权限这样做:)
    猜你喜欢
    • 2014-04-12
    • 2018-08-05
    • 1970-01-01
    • 2020-10-27
    • 2015-05-27
    • 2018-06-15
    • 1970-01-01
    • 2016-10-08
    相关资源
    最近更新 更多