mysqldump - cron job

时间:2014-03-11 06:26:09

标签: php cron mysqldump cpanel

我试图通过每天运行的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 ...]

OR mysqldump [OPTIONS] --all-databases [OPTIONS]

有关更多选项,请使用mysqldump --help

sh:-h:找不到命令

所以看起来它与-h

有关

~~~

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

6 个答案:

答案 0 :(得分: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"

我将该文件保存为db_backup.sh文件夹中的/usr/local/bin/,并确保它将是可执行数据库备份的用户可读/可执行文件。现在,我可以从系统的任何位置运行# db_backup.sh,它将起作用。

为了使它成为一个cron,我放了一个名为' db_backup' (我的/etc/crond.d/文件夹里面的名称并不重要(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

答案 1 :(得分:0)

我认为你的密码字符串上有一些奇怪的字符。也许是"`"这就是为什么你得到两个错误的原因。 第一个来自mysqldump因为你没有指定任何数据库(因为断字符串)而第二个来自shell说无法找到-h命令(密码后面的下一个字符串)

尝试在system_call(http://www.php.net/escapeshellcmd

之前转义$ backup_command
system(escapeshellcmd($backup_command));

答案 2 :(得分:0)

您不应该使用-p选项,因为系统中的任何人都可以通过ps aux读取此内容。

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

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

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

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

这样,系统上没有密码暴露给其他用户。它甚至可以用未转义的复杂密码修复您的proglem。

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

答案 3 :(得分:-1)

 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

答案 4 :(得分:-1)

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

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

答案 5 :(得分:-1)

尝试添加-u和用户名

之间的空格
$backup_command = "mysqldump -u " . $database_user . " -p" . $database_pass . " -h " .      $database_server . " " . $database_target . " > " . $sql_backup_file;
                               ^

如果位于localhost的数据库服务器删除了主机参数

$backup_command = "mysqldump -u " . $database_user . " -p" . $database_pass . " " . $database_target . " > " . $sql_backup_file;
相关问题