我试图通过每天运行的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
有关~~~
有人对如何修复有任何想法吗?
答案 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_commandsystem(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;