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

可能是什么问题?

【问题讨论】:

如果你对mysqldumpgzip使用完整路径怎么办? 您打算每分钟运行一次此作业吗? @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 也已安装。

使用mysqlmysqldump 时会自动读取此文件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 -esave时,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 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

百分号 % 在 crontab 中不起作用

装入crontab的命令在macOS中不起作用

Bash + Expect脚本在cron RHEL 7中不起作用

具有 kerberos 安全性的 Sqoop 在 cron 中不起作用,抛出 GSSException

mailto crontab 不起作用

Linux定时任务Crontab不起作用的排查步骤