Aufbewahrung: Tägliche Backups für eine Woche, wöchentlich für einen Monat, monatlich für ein Jahr und jährlich danach


14

Ich muss täglich Daten und Konfigurationsdateien auf diesem Server sichern. Ich muss behalten:

  • tägliche Backups für eine Woche
  • wöchentliche Backups für einen Monat
  • monatliche Backups für ein Jahr
  • jährliche Backups danach

All dies wird über ein Shell-Skript erreicht, das täglich von cron ausgeführt wird.

So sollten die Sicherungsdateien nach 10 Jahren Laufzeit aussehen:

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
... mein normaler Vorschlag wäre "Use Bacula " (oder eine andere Backup-Software, die die Speicherung und Rotation für Sie
erledigt

1
Diese Frage hat mich veranlasst, cronicle < github.com/Kraymer/cronicle > zu schreiben, da die akzeptierte Antwort den offensichtlichen Fehler aufweist, Backups in die Ordner daily / week / etc zu duplizieren. Cronicle verwendet Symlinks und kümmert sich um die Rotation. Dabei werden die zugrunde liegenden Dateien gelöscht, wenn keine Ordner Symlinks enthalten, die darauf verweisen.
Kraymer

Antworten:


29

Sie übertreiben dies ernsthaft. Schlecht.

Hier ist ein Pseudocode:

  • Jeden Tag:
    • Erstellen Sie eine Sicherungskopie, und legen Sie sie in einem dailyVerzeichnis ab
    • entferne alles außer den letzten 7 dailyBackups
  • Jede Woche:
    • Erstellen Sie eine Sicherungskopie, und legen Sie sie in einem weeklyVerzeichnis ab
    • entferne alles außer den letzten 5 weeklyBackups
  • Jeden Monat:
    • Erstellen Sie eine Sicherungskopie, und legen Sie sie in einem monthlyVerzeichnis ab
    • Entfernen Sie alles außer den letzten 12 monthlySicherungen
  • Jedes Jahr:
    • Erstellen Sie eine Sicherungskopie, und legen Sie sie in einem yearlyVerzeichnis ab

Die Menge an Logik, die Sie implementieren müssen, ist ungefähr gleich, oder? KUSS.

Das sieht einfacher aus:

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

Oder nach Anzahl der Dateien anstelle des Alters:

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

Ich habe eigentlich keine separaten Verzeichnisse. Es wurde geschrieben, um Dateien in einem S3-Bucket abzulegen. Sobald sich alles an einem Ort befindet, ist die Gesamtmenge an Logik, die Sie implementieren müssen, ungefähr gleich, unabhängig davon, wie Sie vorgehen.
Florin Andrei

5
Offensichtlich ist es nicht.
MadHatter

6

Wenn Sie beispielsweise nur 8 tägliche Backups und 5 wöchentliche Backups (jeden Sonntag) aufbewahren möchten, funktioniert dies folgendermaßen:

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

Ab heute (10.11.2014) wird Folgendes ausgegeben:

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

Als Übung müssen Sie nur alle Sicherungsdateien löschen, deren Namen nicht im keep-array erscheinen.

Wenn Sie 13 monatliche Backups (jeden ersten Sonntag im Monat) und 6 jährliche Backups (jeden ersten Sonntag im Jahr) erstellen möchten, wird es etwas komplizierter:

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

Ab heute (10.11.2014) wird Folgendes ausgegeben:

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

Löschen Sie wie oben alle Sicherungsdateien, die in diesem Array nicht vorhanden sind.


Schön, und wie mache ich das rm /dir/*.* except keep[@]?
Takeshin

0

Wie in einem Kommentar erwähnt, ist es normalerweise am besten, die Aufgabe der Verwaltung von Sicherungen an eine Sicherungsverwaltungssoftware zu delegieren.

Aber hier ist die Logik in Bash zum Löschen älterer Backups nach Ihren Wünschen

#!/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-Code, der anzeigt, welche Dateien nach 3520 Tagen noch ausgeführt werden

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
)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.