我已经创建了一个cron选项卡,每30分钟备份一次我的数据库...
*/30 * * * * bash /opt/mysqlbackup.sh > /dev/null 2>&1cron选项卡运行良好。每隔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?
我总是有一个?在我的文件名的末尾..你知道为什么吗?
谢谢你的帮助
发布于 2020-03-03 07:20:33
问号通常表示无法显示的字符;它位于行尾的事实使我认为您的脚本使用的是Windows行结尾,而不是Unix。您可以使用dos2unix命令进行修复:dos2unix /path/to/script.sh
最好不要在命令行界面上抛出MySQL密码,也不要将它们存储在可执行脚本中。您可以通过使用MySQL Option files,特别是定义用户级选项(~/.my.cnf)的文件来实现这一点。
然而,这需要我们找出哪个用户正在执行该cronjob。我的假设是,您没有在系统级的crontab中进行该定义;如果进行了定义,您实际上将尝试以bash用户的身份执行/opt/mysqlbackup.sh > /dev/null 2>&1。这个用户很可能不存在(也不应该存在),因此cron将无法完全执行脚本。
事实并非如此(您说它执行mysqldump很好),这让我相信您在用户级crontab中有定义。一旦我们找出了我在评论中所要求的实际用户,我们就可以确定文件权限问题,以及创建前面提到的MySQL选项文件。
发布于 2020-04-28 03:14:10
结合使用find和mtime不是最好的选择。如果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个。
https://stackoverflow.com/questions/60453424
复制相似问题