วิธีเก็บรักษา: สำรองข้อมูลรายวันสำหรับสัปดาห์รายสัปดาห์สำหรับเดือนรายเดือนสำหรับปีและรายปีหลังจากนั้น


14

ฉันต้องการสำรองข้อมูลและกำหนดค่าไฟล์บนเซิร์ฟเวอร์นี้ทุกวัน ฉันต้องการที่จะเก็บ:

  • สำรองข้อมูลรายวันเป็นเวลาหนึ่งสัปดาห์
  • สำรองข้อมูลรายสัปดาห์สำหรับเดือน
  • สำรองข้อมูลรายเดือนสำหรับปี
  • สำรองข้อมูลรายปีหลังจากนั้น

ทั้งหมดนี้ทำได้ผ่านเชลล์สคริปต์ที่รันทุกวันจาก 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
... ข้อเสนอแนะปกติของฉันคือ "ใช้Bacula " (หรือซอฟต์แวร์สำรองข้อมูลอื่น ๆ ที่สามารถจัดการการเก็บข้อมูลและการหมุนสำหรับคุณ) :-)
voretaq7

1
คำถามนี้ทำให้ฉันเขียนพงศาวดาร < github.com/Kraymer/cronicle > เพราะคำตอบที่ยอมรับมีข้อบกพร่องที่ชัดเจนในการทำสำเนาสำรองในโฟลเดอร์รายวัน / รายสัปดาห์ / ฯลฯ พงศาวดารอาศัย symlinks และดูแลการหมุนลบไฟล์ต้นแบบเมื่อไม่มีโฟลเดอร์ที่มี symlink ชี้ไปที่มัน
kraymer

คำตอบ:


29

คุณจริงจังกับเรื่องนี้มากเกินไป ไม่ดี.

นี่คือรหัสเทียมบางส่วน:

  • ทุกวัน:
    • ทำการสำรองข้อมูลใส่ลงในdailyไดเรกทอรี
    • ลบทุกอย่างยกเว้นการdailyสำรองข้อมูล7 ครั้งล่าสุด
  • ทุกสัปดาห์:
    • ทำการสำรองข้อมูลใส่ลงในweeklyไดเรกทอรี
    • ลบทุกอย่างยกเว้นการweeklyสำรองข้อมูล5 ครั้งล่าสุด
  • ทุกๆเดือน:
    • ทำการสำรองข้อมูลใส่ลงในmonthlyไดเรกทอรี
    • ลบทุกอย่างยกเว้นการmonthlyสำรองข้อมูล12 ครั้งล่าสุด
  • ทุกปี:
    • ทำการสำรองข้อมูลใส่ลงใน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

ตามที่ระบุไว้ในความคิดเห็นเป็นปกติดีที่สุดในการมอบหมายงานการจัดการการสำรองข้อมูลไปยังซอฟต์แวร์การจัดการการสำรองข้อมูล

แต่นี่คือตรรกะในการทุบตีสำหรับการลบการสำรองข้อมูลเก่าตามที่คุณต้องการ

#!/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 แสดงไฟล์ใดจะยังคงอยู่หลังจากทำงานเป็นเวลา 3520 วัน

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.