mysqldump 在 crontab 中不起作用
Posted
技术标签:
【中文标题】mysqldump 在 crontab 中不起作用【英文标题】:mysqldump doesn't work in crontab 【发布时间】:2013-11-12 21:54:23 【问题描述】:我正在尝试在备份 mysql 数据库的 crontab(ubuntu 服务器)中添加一个 cronjob。
以 root 身份在终端中执行脚本效果很好,但插入 crontab 中没有任何反应。我尝试每分钟运行一次,但 /var/db_backups 文件夹中没有文件出现。
(其他 cronjobs 运行良好)
这是 cronjob:
* * * * * mysqldump -u root -pHERE 有我的密码 --所有数据库| gzip > /var/db_backups/database_`date +%d%m%y`.sql.gz
可能是什么问题?
【问题讨论】:
如果你对mysqldump
和gzip
使用完整路径怎么办?
您打算每分钟运行一次此作业吗?
@fedorqui 我试过使用:/usr/bin/mysqldump /usr/local/gnu/gzip 但它是一样的。
@JaneAvriette 绝对没有。我只是尝试每分钟运行一次以进行测试
您的密码是否包含#
$
等特殊字符?
【参考方案1】:
本地主机mysql备份: 0 1 * * * /usr/local/mysql/bin/mysqldump -uroot -ppassword --opt 数据库 > /path/to/directory/filename.sql
(-p 和密码或 -u 和用户名之间没有空格 - 将 root 替换为正确的数据库用户名。)
它对我有用。 -p 和密码或 -u 和用户名之间没有空格
【讨论】:
【参考方案2】:我也尝试过,但我发现转储是用 0KB 创建的。因此,我了解了节省时间的解决方案。
命令:
0 0 * * * mysqldump -u 'USERNAME' -p'PASSWORD' DATEBASE > /root/liveDB_`date +\%Y\%m\%d_\%H\%M\%S`.sql
注意: 1)您可以根据需要更改时间设置。我已经在上面的命令中设置了每一天。
2) 确保在单引号 (') 中输入您的用户名、密码和数据库。
3) 在 Crontab 中写下上述命令。
我希望这对某人有所帮助。
【讨论】:
【参考方案3】:我在 Ubuntu 上使用 Percona Server(一个 MySQL 分支)。该软件包(很可能也是常规 MySQL 软件包)附带一个名为 debian-sys-maint
的维护帐户。为了使用此帐户,在安装软件包时会创建凭据;它们存储在/etc/mysql/debian.cnf
。
现在令人惊讶的是:指向 /etc/mysql/debian.cnf
的符号链接 /root/.my.cnf
也已安装。
使用mysql
或mysqldump
时会自动读取此文件an option file。所以基本上你有两次登录凭据 - 在那个文件和命令行中。这就是我遇到的问题。
因此,避免这种情况的一种解决方案是为mysqldump
使用--no-defaults
选项。然后将不会读取选项文件。但是,您通过命令行提供凭据,因此任何可以发出ps
的人都可以在备份运行后实际看到密码。因此,最好使用用户名和密码创建一个自己的选项文件,并将其通过--defaults-file
传递给mysqldump
。
您可以使用mysql_config_editor
或简单地在任何编辑器中创建选项文件。
从命令行通过sudo
运行mysqldump
,因为root
有效,只是因为sudo
通常不会更改$HOME
,因此找不到.my.cnf
。当作为 cronjob 运行时,它是。
【讨论】:
【参考方案4】:好的,我遇到了类似的问题并且能够解决它。
在您的情况下,您可以将该 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
【讨论】:
【参考方案5】:您可能还需要重新启动服务以加载您的任何更改。
service cron restart
或
/etc/init.d/cron restart
【讨论】:
当你crontab -e
和save
时,cron会自动安装新的crontab,不需要重启
重启crontab
不是必需的,实际上是对上述问题的误导【参考方案6】:
你需要用 \ 转义 % 字符
mysqldump -u 'username' -p'password' DBNAME > /home/eric/db_backup/liveDB_`date +\%Y\%m\%d_\%H\%M`.sql
【讨论】:
我要投票+10!没有其他来源(许多谷歌结果、网站、论坛帖子)给了我这个结果,这就是我的解决方案。如果没有这个答案,我会搜索几个小时...... 我犯的一个错误是在 -p 和我的密码之间留了一个空格,应该没有空格,即 -pPASSWORD @Basj:如果我搜索了几个小时直到找到这个答案会怎样? 大吃一惊 您的回答非常有用。非常感谢。用 \ 转义 % 字符后,它工作正常。谢谢@Sandeep 这也是我的问题;如果您关注有关“在 Centos 上备份 MySQL”的第一个 Google 链接,它们不包括 \【参考方案7】:创建一个新文件并在那里执行代码以转储到文件位置并压缩它。通过 cron 运行该脚本
【讨论】:
【参考方案8】:您也可以创建自定义命令mycommand。您可以向其中添加更多选项。您必须授予执行权限。
最好有一个文件夹来存储您的所有备份,在这种情况下使用可写文件夹“备份”,例如首先在“您的家”中创建。
我的命令在“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
希望对你有所帮助。
【讨论】:
【参考方案9】:查看 cron 日志(应该在 /var/log/syslog 中)您可以使用 grep 将它们过滤掉。
grep CRON /var/log/syslog
您也可以查看本地邮箱,看看是否有任何 cron 邮件
/var/mail/用户名
您也可以在您的 crontab 文件中设置其他接收邮件
MAILTO=your@mail.com
【讨论】:
我尝试了 grep CRON,它给了我: CMD (/usr/bin/mysqldump -u root -pPASSWORD!--all-databases | gzip > /var/db_backups/database_... 所以命令已执行但不产生输出文件 您是为 root 用户还是为其他用户设置了 cron?也许您的 cron 用户无权执行 mysqldump 我还没有设置任何东西。刚刚在空白的 ubuntu 服务器上使用了 crontab -e。我该如何设置该选项?谢谢 尝试以普通用户dump看看是否有效,检查/var/db_backups/的写入权限和/usr/bin/mysqldump的执行权限en.wikipedia.org/wiki/Chmod 你是对的。作为用户我得到:-bash:/var/db_backups/database_011113.sql.gz:权限被拒绝以上是关于mysqldump 在 crontab 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Bash + Expect脚本在cron RHEL 7中不起作用