我有很多备份,例如:
backup-20130528_054504_mysql.tar.gz,
bill_db_201305290130.BAK.bz2,
etc_20130412.tbz
这是每天进行的完整备份。
在今天之前,我有一个 cron 任务,其命令行如下:
/usr/bin/find /media/backups -ctime +7 -delete
但这是个坏主意。
一台服务器在 7 天前停止进行新的备份(文件系统已满),并且所有旧备份已被 cron 删除。
可能我需要一个新的脚本来替代这个“find -ctime”,它会保存一些旧的备份。
我的所有备份文件都有名称 {unique_prefix}年月日...
我想要这样的东西:
- 去年之前每年进行一次备份
- 去年每个月一个备份
- 上个月每周 4 次备份
- 以及过去 7 天的 7 个备份。
对于每个{unique_prefix}。
所有这些文件都是通过 rsync、ssh 等方式由 cron 下载到我的服务器的。
我不喜欢重新发明轮子,并且很确定这是一项典型的任务。
请指出我的解决方案。
答案1
我不同意 dawud 的观点,我认为简单的备份是最好的。
什么你真正需要的不是更智能的删除方式(虽然这不是一个坏主意,我写了一些类似的东西,只是保留了最后 N 个备份),而是对文件系统进行适当的监控,这样你就能提前注意到它已经满了,然后你就可以采取行动。这样你就不会丢失数据了。
答案2
答案3
您可以使用基于时间的策略(如果您停止制作新的备份则很危险,因为所有备份最终都会被删除):
find . -type f -name 'app-*.tar.gz' -mtime +100 --delete
保留最后 X 件物品是安全的:
ls -t app-*.tar.gz | tail -n +100 | xargs --no-run-if-empty rm
最好的办法是采用每日/每周/每月/每年策略,但这并不容易实施。您可以试试rsnapshot
运气cron
。
有一些库支持删除旧快照,但你需要采用它们的约定: