如何保存:每周备份一次,每周备份一个月,每月备份一年,之后每年备份一次


14

我每天需要备份此服务器上的数据和配置文件。我需要保持:

  • 一周的每日备份
  • 每周备份一个月
  • 一年的每月备份
  • 之后每年备份

所有这些都是通过每天从cron运行的shell脚本完成的。

这是运行10年后备份文件的外观:

blog-20050103.tar.bz2
blog-20060102.tar.bz2
blog-20070101.tar.bz2
blog-20080107.tar.bz2
blog-20090105.tar.bz2
blog-20100104.tar.bz2
blog-20110103.tar.bz2
blog-20120102.tar.bz2
blog-20130107.tar.bz2
blog-20130902.tar.bz2
blog-20131007.tar.bz2
blog-20131104.tar.bz2
blog-20131202.tar.bz2
blog-20140106.tar.bz2
blog-20140203.tar.bz2
blog-20140303.tar.bz2
blog-20140407.tar.bz2
blog-20140505.tar.bz2
blog-20140602.tar.bz2
blog-20140707.tar.bz2
blog-20140728.tar.bz2
blog-20140804.tar.bz2
blog-20140811.tar.bz2
blog-20140816.tar.bz2
blog-20140817.tar.bz2
blog-20140818.tar.bz2
blog-20140819.tar.bz2
blog-20140820.tar.bz2
blog-20140821.tar.bz2
blog-20140822.tar.bz2

9
...我的正常建议是“使用Bacula ”(或其他一些可以为您处理保留和旋转的备份软件):-)
voretaq7 2014年

1
这个问题让我写了小书< github.com/Kraymer/cronicle >,因为公认的答案有一个明显的缺陷,那就是将备份复制到每日/每周/等文件夹中。cronicle依靠符号链接并负责轮换,当没有文件夹包含指向它的符号链接时,删除底层文件。
kraymer

Answers:


29

您正在认真地对此进行过度设计。不好

这是一些伪代码:

  • 每天:
    • 进行备份,放入daily目录
    • 删除除最后7个daily备份以外的所有内容
  • 每周:
    • 进行备份,放入weekly目录
    • 删除除最后5个weekly备份以外的所有内容
  • 每个月:
    • 进行备份,放入monthly目录
    • 删除除最后12个monthly备份以外的所有内容
  • 每年:
    • 进行备份,放入yearly目录

您必须实现的逻辑量大致相同,是吗?吻。

这看起来更容易:

s3cmd ls s3://backup-bucket/daily/ | \
    awk '$1 < "'$(date +%F -d '1 week ago')'" {print $4;}' | \
    xargs --no-run-if-empty s3cmd del

或者,按文件计数而不是使用期限:

s3cmd ls s3://backup-bucket/daily/ | \
    awk '$1 != "DIR"' | \
    sort -r | \
    awk 'NR > 7 {print $4;}' | \
    xargs --no-run-if-empty s3cmd del

我实际上没有单独的目录。它被编写为将文件转储到S3存储桶中。一旦一切都放在一个地方,无论如何进行,所需实现的逻辑总量就几乎相同。
弗洛林·安德烈

5
显然不是。
MadHatter

6

例如,如果您只想保留8个每日备份和5个每周(每个星期日)备份,则其工作方式如下:

for i in {0..7}; do ((keep[$(date +%Y%m%d -d "-$i day")]++)); done
for i in {0..4}; do ((keep[$(date +%Y%m%d -d "sunday-$((i+1)) week")]++)); done
echo ${!keep[@]}

从今天(2014-11-10)开始,这将输出:

20141012 20141019 20141026 20141102 20141103 20141104
20141105 20141106 20141107 20141108 20141109 20141110

作为练习,您只需要删除名称未出现在keep-array 中的所有备份文件。

如果还要保留13个每月备份(每个月的第一个星期日)和6个年度备份(每年的第一个星期日),事情会变得有些复杂:

for i in {0..7}; do ((keep[$(date +%Y%m%d -d "-$i day")]++)); done
for i in {0..4}; do ((keep[$(date +%Y%m%d -d "sunday-$((i+1)) week")]++)); done
for i in {0..12}; do
        DW=$(($(date +%-W)-$(date -d $(date -d "$(date +%Y-%m-15) -$i month" +%Y-%m-01) +%-W)))
        for (( AY=$(date -d "$(date +%Y-%m-15) -$i month" +%Y); AY < $(date +%Y); AY++ )); do
                ((DW+=$(date -d $AY-12-31 +%W)))
        done
        ((keep[$(date +%Y%m%d -d "sunday-$DW weeks")]++))
done
for i in {0..5}; do
        DW=$(date +%-W)
        for (( AY=$(($(date +%Y)-i)); AY < $(date +%Y); AY++ )); do
                ((DW+=$(date -d $AY-12-31 +%W)))
        done
        ((keep[$(date +%Y%m%d -d "sunday-$DW weeks")]++))
done
echo ${!keep[@]}

从今天(2014-11-10)开始,这将输出:

20090104 20100103 20110102 20120101 20130106 20131103
20131201 20140105 20140202 20140302 20140406 20140504
20140601 20140706 20140803 20140907 20141005 20141012
20141019 20141026 20141102 20141103 20141104 20141105
20141106 20141107 20141108 20141109 20141110

与上述相同,只是删除在此阵列中找不到的所有备份文件。


很好,我该怎么办rm /dir/*.* except keep[@]
Takehin 2015年

0

如评论中所述,通常最好将管理备份的任务委托给备份管理软件。

但是,这是bash中根据您的要求删除较早备份的逻辑

#!/bin/sh

delete() {
    echo "Deleting $1"
}

DOW=$(date +%u)

if [ $DOW -eq 1 ]; then
    DATE_DAY=$(date -d "-28 days" +"%d")
    if [ $DATE_DAY -gt 7 ]; then
        DATE=$(date -d "-28 days" +"%Y-%m-%d")
        delete $DATE
    fi

    DATE_DAY=$(date -d "-364 days" +"%d")
    DATE_MONTH=$(date -d "-364 days" +"%m")
    if [ $DATE_DAY -le 7 ] && [ $DATE_MONTH -gt 1 ]; then
        DATE=$(date -d "-364 days" +"%Y-%m-%d")
        delete $DATE
    fi
else
    DATE=$(date -d "-7 days" +"%Y-%m-%d")
    delete $DATE
fi

PHP代码显示运行3520天后仍将保留哪些文件

https://ideone.com/n2ymQy

Array
(
    [0] => 2005-01-03
    [1] => 2006-01-02
    [2] => 2007-01-01
    [3] => 2008-01-07
    [4] => 2009-01-05
    [5] => 2010-01-04
    [6] => 2011-01-03
    [7] => 2012-01-02
    [8] => 2013-01-07
    [9] => 2013-09-02
    [10] => 2013-10-07
    [11] => 2013-11-04
    [12] => 2013-12-02
    [13] => 2014-01-06
    [14] => 2014-02-03
    [15] => 2014-03-03
    [16] => 2014-04-07
    [17] => 2014-05-05
    [18] => 2014-06-02
    [19] => 2014-07-07
    [20] => 2014-07-28
    [21] => 2014-08-04
    [22] => 2014-08-11
    [23] => 2014-08-16
    [24] => 2014-08-17
    [25] => 2014-08-18
    [26] => 2014-08-19
    [27] => 2014-08-20
    [28] => 2014-08-21
    [29] => 2014-08-22
)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.