보관 방법 : 1 주일, 1 주일, 1 개월 동안, 1 년 동안 매일 백업


14

이 서버에서 매일 데이터 및 구성 파일을 백업해야합니다. 나는 유지해야한다 :

  • 일주일 동안 매일 백업
  • 한 달 동안의 주간 백업
  • 1 년간 월간 백업
  • 그 후 매년 백업

이 모든 것은 cron에서 매일 실행되는 쉘 스크립트를 통해 달성되었습니다.

다음은 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
... 나의 일반적인 제안은 "Use Bacula "(또는 유지와 회전을 처리 할 수있는 다른 백업 소프트웨어)입니다 :-)
voretaq7

1
이 대답은 cronicle < github.com/Kraymer/cronicle >을 작성하게 만들었습니다 . 수용된 답변에 백업을 daily / weekly / etc 폴더로 복제하는 명백한 결함이 있기 때문입니다. cronicle은 심볼릭 링크를 사용하고 회전을 처리하여 심볼릭 링크를 가리키는 폴더가없는 폴더는 기본 파일을 삭제합니다.
kraymer

답변:


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 버킷으로 덤프하도록 작성되었습니다. 모든 것이 한곳에 있으면 구현해야하는 총 논리 량은 방법에 관계없이 거의 같습니다.
Florin Andrei

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[@]?
takeshin

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

3520 일 동안 실행 한 후 남을 파일을 표시하는 PHP 코드

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
)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.