Soru Nasıl korunulur: Bir hafta boyunca günlük yedeklemeler, bir ay için haftalık, bir yıl için aylık ve bundan sonra yıllık olarak


Günlük olarak bu sunucudaki verileri ve yapılandırma dosyalarını yedeklemem gerekiyor. Tutmaya ihtiyacım var:

  • bir hafta boyunca günlük yedeklemeler
  • bir ay boyunca haftalık yedeklemeler
  • bir yıl için aylık yedeklemeler
  • bundan sonra yıllık yedeklemeler

Tüm bunlar, günlük olarak, cron'dan bir kabuk betiği ile gerçekleştirilir.

Bu, yedekleme dosyalarının 10 yıllık çalışmanın ardından nasıl görünmesi gerektiği:

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

13
2018-02-12 21:10


Menşei


... normal önerim şöyle olurdu: Bacula"(veya sizin için saklama ve döndürme işlemlerini gerçekleştirebilen başka bir yedekleme yazılımı) :-) - voretaq7
Bu soru bana cronicle yazmamı sağladı <github.com/Kraymer/cronicle> Çünkü kabul edilen cevap, günlük / haftalık / etc klasörlerine yedek kopyaların bariz kusuruna sahip. cronicle, symlink'lere dayanır ve hiçbir klasör, kendisine işaret eden sembolik bağlantılar içermediğinde, temel dosyaları siler. - kraymer


Cevaplar:


Bunu ciddi olarak aşırı mühendislik yapıyorsunuz. Kötü.

İşte bazı sözde kodlar:

  • Her gün:
    • bir yedekleme yapmak daily rehber
    • son 7 hariç her şeyi kaldır daily yedeklemeler
  • Her hafta:
    • bir yedekleme yapmak weekly rehber
    • son 5 hariç her şeyi kaldır weekly yedeklemeler
  • Her ay:
    • bir yedekleme yapmak monthly rehber
    • her şeyi kaldır ama son 12 monthly yedeklemeler
  • Her yıl:
    • bir yedekleme yapmak yearly rehber

Uygulamanız gereken mantık miktarı aynı şeydir, ha? ÖPMEK.

Bu daha kolay görünüyor:

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

Ya da, yaş yerine dosya sayısına göre:

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

25
2018-02-12 21:21



Aslında ayrı dizinlerim yok. Dosyaları bir S3 kovasına dökmek için yazılmıştır. Her şey bir yerde olduğunda, uygulamak için ihtiyacınız olan toplam mantık miktarı, bununla ilgili nasıl giderseniz gidin, aynıdır. - Florin Andrei
Açıkçası öyle değil. - MadHatter


Örneğin, 8 günlük yedekleme ve 5 haftalık (her pazar) yedeklemeyi korumak istiyorsanız, şu şekilde çalışır:

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[@]}

Bugün itibariyle (2014-11-10), bu çıktı olacak:

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

Sizin için bırakılan bir egzersiz olarak, adlarında görünmeyen tüm yedek dosyalarını silmeniz yeterlidir. keep-dizi.

13 aylık yedeklemeyi (her ayın ilk pazar günü) ve 6 yıllık yedeklemeyi (her yılın ilk pazarı) da tutmak istiyorsanız, işler biraz daha karmaşıklaşır:

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[@]}

Bugün itibariyle (2014-11-10), bu çıktı olacak:

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

Yukarıdaki gibi aynı, bu dizide bulunmayan tüm yedek dosyalarını silin.


6
2017-11-10 19:01



Güzel ve nasıl yaparım rm /dir/*.* except keep[@]? - takeshin


Bir yorumda belirtildiği gibi, yedekleri bir yedekleme yönetim yazılımına yönetme görevini devretmek normaldir.

Ama burada, gereksiniminize göre eski yedekleri silmek için bash mantığı var.

#!/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

3520 gün boyunca çalıştıktan sonra hangi dosyaların kalacağını gösteren PHP Kodu

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
)

0
2017-10-31 11:26