我有很多备份,例如:
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} YYYYMMDD ...
我想要这样的东西:
- 前一年每年备份一次
- 去年每个月备份一次
- 上个月每周 4 个备份
- 以及最近 7 天的 7 个备份。
对于每个 {unique_prefix}。
所有这些文件都由 cron 通过 rsync、ssh 等下载到我的服务器。
我不喜欢重新发明轮子,而且很确定这是一项典型的任务。
请指出我的解决方案。
shell 脚本可以处理达到一定复杂程度的备份。您还拥有可以利用
tar
并rsync
完成更复杂任务的工具(rsnapshot
例如,)。但是,看起来您需要一个非常细粒度的备份和保留策略,除非它不必要地复杂并且提到的其他工具不提供,否则 shell 脚本可能不太适合处理。
您应该考虑为此任务使用专用软件。有很多,但想到了bacula和amanda 。
我不同意 dawud,认为简单的备份是最好的。
你真正需要的不是删除东西的更聪明的方法(虽然这不是一个坏主意,我写了一些类似的东西只是保留最后的 N 备份),而是适当地监控你的文件系统所以你会注意到它填满了早在它发生之前,你就可以采取行动。这样你就不会丢失你的数据。
您可以使用基于时间的策略(如果您停止生成新备份会很危险,因为所有备份最终都会被删除):
保留最后 X 项是安全的:
您可以通过每天/每周/每月/每年的策略获得最好的结果,这并非易事。你可以试试运气
rsnapshot
和cron
。有些库支持删除旧快照,但您需要采用它们的约定: