Cara menyimpan: backup harian selama seminggu, mingguan selama sebulan, bulanan selama setahun, dan tahunan setelah itu


14

Saya perlu membuat cadangan data dan mengonfigurasi file di server ini, setiap hari. Saya perlu menjaga:

  • backup harian selama seminggu
  • backup mingguan selama sebulan
  • backup bulanan selama satu tahun
  • backup tahunan setelah itu

Semua ini dilakukan melalui skrip shell yang dijalankan setiap hari dari cron.

Beginilah tampilan file cadangan setelah 10 tahun berjalan:

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
... saran normal saya adalah "Gunakan Bacula " (atau perangkat lunak cadangan lain yang dapat menangani retensi dan rotasi untuk Anda) :-)
voretaq7

1
pertanyaan ini membuat saya menulis cronicle < github.com/Kraymer/cronicle > karena jawaban yang diterima memiliki cacat yang jelas untuk menggandakan cadangan ke folder harian / mingguan / dll. cronicle bergantung pada symlink dan mengurus rotasi, menghapus file yang mendasarinya ketika tidak ada folder yang mengandung symlink yang menunjuk padanya.
Kraymer

Jawaban:


29

Anda benar-benar rekayasa berlebihan ini. Sangat.

Inilah beberapa pseudocode:

  • Setiap hari:
    • buat cadangan, masukkan ke dailydirektori
    • hapus semuanya kecuali 7 dailycadangan terakhir
  • Setiap minggu:
    • buat cadangan, masukkan ke weeklydirektori
    • hapus semuanya kecuali 5 weeklybackup terakhir
  • Setiap bulan:
    • buat cadangan, masukkan ke monthlydirektori
    • hapus semuanya kecuali 12 monthlycadangan terakhir
  • Setiap tahun:
    • buat cadangan, masukkan ke yearlydirektori

Jumlah logika yang harus Anda implementasikan hampir sama, eh? CIUMAN.

Ini terlihat lebih mudah:

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

Atau, berdasarkan jumlah file, bukan berdasarkan usia:

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

Saya sebenarnya tidak memiliki direktori terpisah. Itu ditulis untuk membuang file ke dalam ember S3. Setelah semuanya ada di satu tempat, jumlah total logika yang perlu Anda terapkan hampir sama, tidak peduli bagaimana Anda melakukannya.
Florin Andrei

5
Jelas tidak.
MadHatter

6

Jika Anda hanya ingin menyimpan, misalnya, 8 cadangan harian dan 5 cadangan mingguan (setiap minggu), kerjanya seperti ini:

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

Mulai hari ini (2014-11-10), ini akan menampilkan:

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

Sebagai latihan yang tersisa untuk Anda, Anda hanya perlu menghapus semua file cadangan yang namanya tidak muncul di keep-array.

Jika Anda ingin menyimpan 13 backup bulanan (minggu pertama setiap bulan) dan 6 backup tahunan (minggu pertama setiap tahun), hal-hal menjadi sedikit lebih rumit:

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

Mulai hari ini (2014-11-10), ini akan menampilkan:

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

Sama seperti di atas, cukup hapus semua file cadangan yang tidak ditemukan dalam array ini.


Bagus, dan bagaimana saya melakukannya rm /dir/*.* except keep[@]?
takeshin

0

Seperti disebutkan dalam komentar, biasanya lebih baik untuk mendelegasikan tugas mengelola cadangan ke perangkat lunak manajemen cadangan.

Tapi di sini ada logika di bash untuk menghapus cadangan yang lebih lama sesuai kebutuhan Anda

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

Kode PHP menunjukkan file mana yang akan tetap setelah berjalan selama 3520 hari

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
)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.