【问题标题】:mysqldump - cron jobmysqldump - 定时任务
【发布时间】:2014-04-14 14:38:35
【问题描述】:

我正在尝试通过每天运行的 cron 作业自动备份我们的 mysql 数据库。

我们有:

$database_user = 'VALUE';
$database_pass = 'VALUE';
$database_server = 'localhost';
// Name of the database to backup
$database_target = 'VALUE';
// Get Database dump
$sql_backup_file = $temp_dir . '/sql_backup.sql';
$backup_command = "mysqldump -u" . $database_user . " -p" . $database_pass . " -h " .      $database_server . " " . $database_target . " > " . $sql_backup_file;
system($backup_command);
// End Database dump

问题是我们从 Cron 守护进程收到一条消息:

用法:mysqldump [OPTIONS] 数据库[tables]

OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]

或 mysqldump [选项] --all-databases [选项]

更多选项,使用 mysqldump --help

sh: -h: 找不到命令

所以看起来它与-h有关

~~~

有人对如何修复有任何想法吗?

【问题讨论】:

  • 如果它的本地主机,那么只需删除 -h 选项,如 mysqldump -u user -p pass dbname > backup.sql
  • 下面提到的选项都没有任何区别。我尝试了各种方法,现在只收到 Usage 消息。

标签: php cron mysqldump cpanel


【解决方案1】:

首先,我建议您升级到 mysql 5.6+,以便您可以更安全地保护您的数据库密码。首先,您将按照this stackoverflow answer 的说明为命令行脚本设置更安全的 mysql 登录方法。

您可能应该编写一个 bash 脚本而不是使用 PHP。这是一个完整的备份脚本,非常简单。 db_name 是您的数据库的名称,/path/to/backup_folder/ 显然是您要存储备份的位置。 --login-path=local 开关将查看运行此 bash 脚本的任何人的主目录,并查看那里是否有登录文件(当前用户必须可读且其他人无法访问)。

#!/bin/bash
#$NOW will provide you with a timestamp in the filename for the backup
NOW=$(date +"%Y%m%d-%H%M%S")

DB=/path/to/backup_folder/"$NOW"_db_name.sql.gz
mysqldump --login-path=local db_name | gzip > "$DB"

#You could change permissions on the created file if you want
chmod 640 "$DB"

我将该文件保存为/usr/local/bin/ 文件夹内的db_backup.sh,并确保将要进行数据库备份的用户可以读取/可执行该文件。现在我可以在系统上的任何地方运行# db_backup.sh,它可以工作了。

为了使它成为一个 cron,我在我的 /etc/crond.d/ 文件夹中放置了一个名为“db_backup”的文件(名称并不重要),看起来像这样(user_name 是应该运行备份的用户脚本)

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:usr/local/bin
MAILTO=root
HOME=/
# "user_name" will try to run "db-backup.sh" every day at 3AM
0 3 * * * user_name db-backup.sh

【讨论】:

  • 我实现了您的解决方案 - 但正如您在此 post 中所说的那样,当我从 crontab 执行脚本时总是出错:mysqldump: Got error: 1045: Access denied for user 'root'@'localhost' (using password: NO) when trying to connect。使用 cron 的 --login-path 功能真的没有解决方案吗?
  • @Mel_T 我认为一定有,但我还没有回来寻找它。但既然你提醒了我,我可能会再试一次。
【解决方案2】:

我认为您的密码字符串中有一些奇怪的字符。也许是一个“`”字符,这就是为什么你会同时出现两个错误。 第一个来自 mysqldump,因为您没有指定任何数据库(因为字符串损坏),第二个来自 shell 说找不到 -h 命令(密码后的下一个字符串)

尝试在 system_call 之前转义 $backup_command (http://www.php.net/escapeshellcmd)

system(escapeshellcmd($backup_command));

【讨论】:

    【解决方案3】:

    你不应该使用-p选项,因为系统上的任何人都可以通过ps aux读出它。

    这是在选项文件中为 mysqldump 指定凭据的更好方法:

    [client]
    host = localhost
    user = root
    password = "password here"
    

    然后你像这样调用你的脚本:

    mysqldump --defaults-file=/etc/my-option-file.cnf  ...other-args
    

    这样,您的系统上的密码就不会暴露给其他用户。它甚至还可以使用未转义的复杂密码解决您的问题。

    我还建议您查看此项目以获得更多想法: mysqldump-secure

    【讨论】:

      【解决方案4】:
       Do not keep space between -p and $database_pass. You need to write the password 
      
         immediately after the -p, without a space.
      
      $backup_command = "mysqldump -u" . $database_user . " -p" . $database_pass . " -h " . 
           $database_server . " " . $database_target . " > " . $sql_backup_file;
      
      
       hope will work for you
      

      【讨论】:

        【解决方案5】:

        您需要提供数据库名称。如果您想为所有人备份,请添加 --all-databases 并删除 -p 和密码之间的空格

        "mysqldump -u" . $database_user . " -p" . $database_pass . " -h " .
        $database_server . " --all-databases" . $database_target . " > " . 
        $sql_backup_file;
        

        【讨论】:

        • 同时删除 -p 和密码之间的空格
        • -p和密码之间没有空格?
        【解决方案6】:

        通过在-u 和用户名之间添加空格来试试这个

        $backup_command = "mysqldump -u " . $database_user . " -p" . $database_pass . " -h " .      $database_server . " " . $database_target . " > " . $sql_backup_file;
                                       ^
        

        如果数据库服务器位于本地主机,则删除主机参数

        $backup_command = "mysqldump -u " . $database_user . " -p" . $database_pass . " " . $database_target . " > " . $sql_backup_file;
        

        【讨论】:

          猜你喜欢
          • 2015-03-11
          • 2017-10-14
          • 2020-03-31
          • 2023-03-27
          • 1970-01-01
          • 1970-01-01
          • 2013-10-25
          • 2011-06-28
          相关资源
          最近更新 更多