首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysqldump - cron作业

mysqldump - cron作业
EN

Stack Overflow用户
提问于 2014-03-11 14:26:09
回答 6查看 1.9K关注 0票数 1

我试图通过一个每天运行的cron作业来自动备份我们的mysql数据库。

我们有:

代码语言:javascript
复制
$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选项数据库表

或者mysqldump选项--databases OPTIONS DB1 DB2 DB3...

或mysqldump选项-所有数据库选项

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

sh:-h:找不到命令

所以看起来像是和-h有关

代码语言:javascript
复制

有没有人对如何修复有什么想法?

EN

回答 6

Stack Overflow用户

发布于 2015-01-20 08:00:19

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

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

代码语言:javascript
复制
#!/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,我在我的/etc/crond.d/文件夹中放置了一个名为'db_backup‘的文件(名称并不重要),如下所示(user_name是应该运行备份脚本的用户)

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-03-14 18:16:15

我想你的密码字符串上有一些奇怪的字符。也许是一个"`“字符,这就是为什么你会得到这两个错误。

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

代码语言:javascript
复制
system(escapeshellcmd($backup_command));
票数 0
EN

Stack Overflow用户

发布于 2016-02-06 01:18:33

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

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

代码语言:javascript
复制
[client]
host = localhost
user = root
password = "password here"

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

代码语言:javascript
复制
mysqldump --defaults-file=/etc/my-option-file.cnf  ...other-args

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

我还建议你看看这个项目,以获得更多的想法:mysqldump-secure

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22318021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档