Nasıl tutulur: bir hafta boyunca günlük yedeklemeler, bir ay boyunca haftalık, bir yıl için aylık ve bundan sonraki yıllık yedeklemeler


14

Bu sunucudaki verileri günlük olarak yedeklemem ve dosyaları yapılandırmam gerekiyor. Tutmam gerek:

  • bir haftalık günlük yedeklemeler
  • bir aylık haftalık yedeklemeler
  • bir yıllık aylık yedeklemeler
  • bundan sonraki yıllık yedeklemeler

Tüm bunlar günlük olarak cron'dan çalıştırılan bir kabuk betiği ile gerçekleştirildi.

Yedekleme dosyaları 10 yıl çalıştıktan sonra şöyle görünmelidir:

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
... benim normal önerim "Kullan Bacula " (veya sizin için tutma ve döndürme işleyebilir başka bir yedekleme yazılımı) olacaktır :-)
voretaq7

1
bu soru beni < github.com/Kraymer/cronicle > kronikülü yazmamı sağladı, çünkü kabul edilen cevap, günlük / haftalık / etc klasörlerine yedekleri çoğaltmanın açık bir kusuruna sahip. cronicle semboliklere dayanır ve rotasyona dikkat eder, hiçbir klasör ona işaret eden sembolik bağlantılar içermediğinde alttaki dosyaları siler.
kraymer

Yanıtlar:


29

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

İşte bazı sözde kod:

  • Her gün:
    • bir yedekleme yap, dailydizine koy
    • son 7 dailyyedeklemeden başka her şeyi kaldır
  • Her hafta:
    • bir yedekleme yap, weeklydizine koy
    • son 5 weeklyyedeklemeden başka her şeyi kaldır
  • Her ay:
    • bir yedekleme yap, monthlydizine koy
    • son 12 monthlyyedek hariç her şeyi kaldır
  • Her yıl:
    • bir yedekleme yap, yearlydizine koy

Uygulamanız gereken mantık miktarı hemen hemen aynı, 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

Veya 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

Aslında ayrı dizinlerim yok. Dosyaları bir S3 kovasına dökmek için yazılmıştır. Her şey tek bir yerde olduğunda, nasıl devam ederseniz edin, uygulamanız gereken toplam mantık miktarı hemen hemen aynıdır.
Florin Andrei

5
Açıkçası öyle değil.
MadHatter

6

Örneğin, 8 günlük yedek ve 5 haftalık (her pazar) yedek tutmak 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), bunun çıktısı:

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

Sizin için bir alıştırma olarak, isimleri keep-dizisinde görünmeyen tüm yedekleme dosyalarını silmeniz yeterlidir.

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

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), bunun çıktısı:

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 ile aynı, bu dizide bulunmayan tüm yedekleme dosyalarını silin.


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

0

Bir yorumda belirtildiği gibi, normalde yedekleri yönetme görevini bir yedekleme yönetimi yazılımına devretmek en iyisidir.

Ancak, gereksiniminize göre eski yedekleri silmek için bash mantığı

#!/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ırıldı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
)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.