mysqldump在crontab中无法工作

36

我正在尝试在crontab(ubuntu服务器)中添加一个定时任务,备份mysql数据库。

在终端以root身份执行脚本可以正常工作,但插入到crontab中却没有任何反应。我尝试了每分钟运行它,但在文件夹/var/db_backups中没有任何文件出现。

(其他定时任务正常工作)

以下是定时任务:

* * * * * mysqldump -u root -p HERE THERE IS MY PASSWORD --all-databases | gzip > /var/db_backups/database_`date +%d%m%y`.sql.gz

可能的问题是什么?


2
如果您使用mysqldumpgzip的完整路径,会发生什么? - fedorqui
你打算让这个任务每分钟运行一次吗? - jane arc
1
@fedorqui 我已经尝试使用:/usr/bin/mysqldump /usr/local/gnu/gzip,但结果相同。 - xspecial
3
@JaneAvriette 绝对不是。我只是为了测试目的而尝试每分钟运行一次。 - xspecial
你的密码中是否包含特殊字符,例如 # $ 等? - Anshul Goyal
Stack Overflow是一个关于编程和开发问题的网站。这个问题似乎不属于编程或开发范畴。请参阅帮助中心中的我可以在这里问什么样的问题。也许超级用户Unix&Linux Stack Exchange更适合提问。 - jww
9个回答

114

你需要使用 \ 转义 % 符号。

mysqldump -u 'username' -p'password' DBNAME > /home/eric/db_backup/liveDB_`date +\%Y\%m\%d_\%H\%M`.sql

14
我想投+10的票!除了这个答案(很多谷歌结果、网站和论坛帖子)没有给我其他结果,这对我来说是一个解决方案。如果没有这个答案,我会搜索好几个小时...... - Basj
4
我犯了一个错误,就是在“-p”和我的密码之间留了一个空格,实际上不应该有空格,即应为“-pPASSWORD”。 - Manny265
1
@Basj:如果我搜索了几个小时才找到这个答案,那会怎么样? 惊呆了 - Benoit Duffez
1
非常感谢你的回答,对我很有帮助。在用 \ 转义 % 字符后,它能够正常工作了。感谢 @Sandeep。 - Geraldo Novais
1
这也是我的问题;如果你按照第一个谷歌链接关于"在Centos上备份MySQL",他们没有包括\。 - tsumnia
显示剩余3条评论

9

我也试过相同的方法,但发现生成的转储文件大小为0KB。因此,我找到了解决方案,节省了时间。

命令:

0 0 * * * mysqldump -u 'USERNAME' -p'PASSWORD' DATEBASE > /root/liveDB_`date +\%Y\%m\%d_\%H\%M\%S`.sql

注意: 1) 您可以根据自己的需求更改时间设置。我在上面的命令中设置了每天。

2) 请确保在单引号(')内输入您的用户名、密码和数据库。

3) 将上述命令写入Crontab。

希望这能帮助到大家。


6

检查cron日志(应该在/var/log/syslog中)。您可以使用grep过滤它们。

grep CRON /var/log/syslog

另外,您可以检查本地邮件箱,看是否有任何cron邮件。

/var/mail/username

您还可以在crontab文件中设置其他接收邮件的方式。

MAILTO=your@mail.com


我尝试使用grep CRON命令,结果显示:CMD (/usr/bin/mysqldump -u root -pPASSWORD! --all-databases | gzip > /var/db_backups/database_... 因此该命令已被执行但未生成输出文件。 - xspecial
你是为root用户还是其他用户设置了cron?也许你的cron用户没有执行mysqldump的权限。 - adam187
我还没有设置任何东西。只是在一个空的Ubuntu服务器上使用了crontab -e命令。 我该如何设置这个选项?谢谢 - xspecial
尝试以常规用户身份进行转储,查看 /var/db_backups/ 的写入权限和 /usr/bin/mysqldump 的执行权限。参考 http://en.wikipedia.org/wiki/Chmod。 - adam187
你是对的。作为用户,我得到了以下信息: -bash: /var/db_backups/database_011113.sql.gz: 权限被拒绝。 - xspecial
显示剩余3条评论

4

或者您可以创建一个自定义命令mycommand,并添加更多选项。您必须授予执行权限。

最好有一个文件夹来存储所有备份,在这种情况下使用可写文件夹“backup”,首先在“您的主目录”中创建它。

我的命令在“usr/local/bin/mycommand”中:

#!/bin/bash
MY_USER="your_user"
MY_PASSWORD="your_pass"
MY_HOME="your_home"
case $1 in 
"backupall")
    cd $MY_HOME/backup
    mysqldump --opt --password=$MY_PASSWORD --user=$MY_USER  --all-databases > bckp_all_$(date +%d%m%y).sql
    tar -zcvf bckp_all_$(date +%d%m%y).tgz bckp_all_$(date +%d%m%y).sql
    rm bckp_all_$(date +%d%m%y).sql;;
*)  echo "Others";;
esac

Cron:每月的第一天运行。

0 0 1 * * /usr/local/bin/mycommand backupall

我希望这有所帮助。


1

好的,我曾经遇到过类似的问题,并成功解决了。

在你的情况下,你可以将那个mysqldump命令插入到一个脚本中, 然后为执行mysqldump命令的用户源文件 例如:

. /home/bla/.bash_profile

然后使用mysqldump命令的绝对路径。

/usr/local/mysql/bin/mysqldump -u root -pHERE THERE IS MY PASSWORD --all-databases | gzip > /var/db_backups/database_`date +%d%m%y`.sql.gz

1
本地主机mysql备份: 0 1 * * * /usr/local/mysql/bin/mysqldump -uroot -ppassword --opt database > /path/to/directory/filename.sql
(-p和密码或-u和用户名之间没有空格,将root替换为正确的数据库用户名。) 对我有效。-p和密码或-u和用户名之间没有空格。

0

我在Ubuntu上使用Percona Server(MySQL的一个分支)。该软件包(很可能是常规的MySQL软件包)附带了一个名为debian-sys-maint的维护帐户。为了使用此帐户,安装软件包时会创建凭据,并将其存储在/etc/mysql/debian.cnf中。

现在有个惊喜:还会安装一个符号链接/root/.my.cnf,指向/etc/mysql/debian.cnf

当使用mysqlmysqldump时,该文件会自动读取选项文件。因此,您需要两次提供登录凭据-在该文件中和命令行中。这就是我的问题所在。

因此,避免这种情况的一种解决方案是使用mysqldump--no-defaults选项。然后将不会读取选项文件。但是,您可以通过命令行提供凭据,因此任何可以发出ps命令的人在备份运行后实际上都可以看到密码。因此,最好创建一个自己的选项文件,其中包含用户名和密码,并通过--defaults-file将其传递给mysqldump

您可以使用mysql_config_editor或任何编辑器来创建选项文件。

通过命令行以root身份使用sudo运行mysqldump是可行的,因为sudo通常不会更改$HOME,所以此时找不到.my.cnf。但是在作为cronjob运行时,就可以找到了。


0
创建一个新文件并在其中执行代码,将其转储到文件位置并进行压缩。通过cron运行该脚本。

-5

你可能还需要重启服务才能加载你的任何更改。

service cron restart

或者

/etc/init.d/cron restart

2
当你使用 crontab -e 命令并保存后,cron 会自动安装新的 crontab,无需重启。 - WeizhongTu
重新启动 crontab 是不必要的,而且对于上述问题实际上是误导性的。 - M. Atif Riaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接