【问题标题】:mysqldump problem in Crontab and bash fileCrontab 和 bash 文件中的 mysqldump 问题
【发布时间】:2020-02-28 14:09:23
【问题描述】:

我创建了一个 cron 选项卡来每 30 分钟备份一次我的数据库...

*/30 * * * * bash /opt/mysqlbackup.sh > /dev/null 2>&1

cron 选项卡运行良好。每 30 分钟我都会使用下面的脚本备份一次。

#!/bin/sh
find /opt/mysqlbackup -type f -mtime +2 -exec rm {} +
mysqldump --single-transaction --skip-lock-tables --user=myuser -- 
password=mypass mydb | gzip -9 > /opt/mysqlbackup/$(date +%Y-%m-%d-%H.%M)_mydb.sql.gz

但我的问题是删除旧数据的rm功能不起作用..这永远不会被删除..你知道为什么吗?

还有...我的备份名称是 2020-02-02-12.12_mydb.sql.gz?

我总是有一个?在我文件名的末尾。你知道为什么吗?

感谢您的帮助

【问题讨论】:

  • find /opt/mysqlbackup -type f -mtime +2 输出什么?如果你通过 cron 调用它怎么样? find /opt/mysqlbackup -type f -mtime +2 > /tmp/cronoutput 有区别吗?
  • 如果我在终端执行find /opt/mysqlbackup -type f -mtime +2 -exec rm {} +...一切正常
  • 是的,但那是在你的 shell 中,而不是 cron 在做什么。向我们展示 cron 看到的命令的输出(没有 rm)。
  • 最好坚持使用 crontabs 中的完整路径。 bash/bin/bash。但是,如果您说脚本的其余部分运行正常,这不是解决方案...
  • 你告诉我的 cron 的输出完全符合我的预期

标签: linux bash cron mysql-backup


【解决方案1】:

问号通常表示无法显示的字符;它位于行尾的事实使我认为您的脚本具有 Windows 行结尾而不是 Unix。您可以使用dos2unix 命令解决此问题: dos2unix /path/to/script.sh

最好不要在 CLI 上乱扔 MySQL 密码或将它们存储在可执行脚本中。您可以使用MySQL Option files 来完成此操作,特别是定义用户级选项的文件 (~/.my.cnf)。

但是,这需要我们弄清楚哪个用户正在执行该 cronjob。我的假设是您没有在系统级 crontab 中做出该定义;如果有,您实际上会尝试以用户bash 的身份执行/opt/mysqlbackup.sh > /dev/null 2>&1。该用户很可能不存在(也不应该存在),因此 cron 将无法完全执行脚本。

由于情况并非如此(您说它正在执行 mysqldump 就好了),这让我相信您在用户级 crontab 中有定义。一旦我们确定了我在评论中要求的实际用户,我们就可以识别文件权限问题并创建上述 MySQL 选项文件。

【讨论】:

    【解决方案2】:

    findmtime 一起使用并不是最佳选择。如果由于某种原因 mysqldump 停止创建备份,那么两天后所有备份都将被删除。

    您可以使用我的 Python 脚本“rotate-archives”进行智能删除备份。 (https://gitlab.com/k11a/rotate-archives)。该脚本在文件或目录名称的开头添加当前日期。比如 2020-12-31_filename.ext。随后使用此日期来决定删除。

    针对您的问题运行脚本:

    rotate-archives.py test_mode=off age_from-period-amount_for_last_timeslot=0-0-48 archives_dir=/mnt/archives
    

    在这种情况下,将始终保存 48 个新档案。超过此数量的旧档案将被删除。

    更灵活的档案删除示例:

    rotate-archives.py test_mode=off age_from-period-amount_for_last_timeslot=7-5,31-14,365-180-5 archives_dir=/mnt/archives
    

    因此,将保留 7 到 30 天的档案,档案之间的时间间隔为 5 天,31 到 364 天的档案之间的时间间隔为 14 天,365 天的档案之间的时间间隔180天和5的数量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-07
      • 2022-09-16
      • 2021-03-30
      • 2013-11-23
      • 2015-08-18
      • 2013-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多