删除旧备份的脚本

删除旧备份的脚本

我有很多备份,例如:

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

Shell 脚本可以处理一定复杂程度的备份。您还可以利用tarrsync完成更复杂的任务(rsnapshot例如)。

然而,看起来你需要一个非常细粒度的备份保留除非该策略不必要地复杂并且上述其他工具不提供,否则 Shell 脚本可能不太适合处理该策略。

您应该考虑使用专用软件来完成此任务。有很多,但是巴库拉阿曼达浮现在脑海中。

答案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

有一些库支持删除旧快照,但你需要采用它们的约定:

相关内容