Differenciális mentés Dar segítségével

Az alábbi szkript segítségével a fontos adatainkról heti teljes és napi differenciális mentést készíthetünk, majd a mentett állományokat szinkronizáljuk a távoli backup kiszolgálóra.
Ez a megoldás egy kicsit hasonlít a korábban bemutatott Központosított mentés Rsync-kel cikkben leírtakra.
Két fő különbség van ahhoz képest:
1. Ebben az esetben a szkript a menteni kívánt kiszolgálón fut és helyben is tárolunk adatot
2. Differenciális mentés az ott bemutatott inkrementálissal szemben


A szkript elején beállítjuk a változókat, majd a hét napja változó függvényében teljes vagy differenciális mentést készítünk.
Az if then ágában figyelhető meg a DAR teljes mentéshez való paraméterezése, míg az else ágban a differenciális mentéshez való paraméterezése

A DAR kapcsolói magyarul:

-w Ne figyelmeztessen DAR fájl felülírásakor - ez kell, hiszen szkriptből futtatjuk felügyelet nélkül
-m a megadott fájlméretnél kisebb fájlokat nem tömöríti [KB]
-y tömörítés mértéke - ebben az esetben a mindenkori alapértelmezettet használjuk
-s A megadott méretűre darabolja a mentésnél létrehozott fájlokat
-D Üres könyvtárak mentése
-R A root könyvtárként használni kívánt könyvtár (mentendő könyvtár)
-c Készítsen mentést (visszaállítás a -r)

Differenciális mentésnél használt kiegészítő kapcsoló:

-A Paraméternek meg kell adni azt a fájlt, amihez viszonyatania kell. Ide a legutoljára létrehozott differenciális mentés során létrejött fájlt kell megani. Ezt a PREC változóban tároljuk és a szkript elején állítjuk be.


Íme a szkript heti teljes mentéshez

#!/bin/bash

DIR=/opt/zimbra/ # ezt mentjük
BACKUPDIR=/backup/dar # ide mentjük a helyi DAR fájlokat
REMOTEBACKUPDIR=backup/ #ide mentjük a távoli gépre

RSYNCUSER=REMOTEUSER
RSYNCHOST=REMOTEHOST
RSYNCPORT=3222
RSYNCBWLIMIT=1024

DAYCOUNT=`date +%u`
PREV=`ls -1tr $BACKUPDIR/dar/*.dar | tail -n 1`

# Ha nem fut le 1 óra alatt, akkor visszafogjuk az erőforrás használatát
sleep 3600 && renice 10 -p `pgrep dar` | logger -t DAR &

if [ $DAYCOUNT -eq 7 ]
then
        echo "teljes mentes" | logger -t DAR
        dar -w -m 256 -y -s 1024M -D -R $DIR -c $BACKUPDIR/fullbackup | logger -t DAR
        find $BACKUPDIR/ -mtime +7 -exec rm -f {} \;
        find $BACKUPDIR/ -name 'diffbackup*' -exec rm -f {} \;
        echo "Rsync kezdete" | logger -t DAR
        rsync -vaurxH --delete --bwlimit=$RSYNCBWLIMIT  --rsh  'ssh -p $RSYNCPORT' $BACKUPDIR $RSYNCUSER@$RSYNCHOST:~/$REMOTEBACKUPDIR | logger -t DAR
else
        echo "differencialis mentes" | logger -t DAR
        dar -w -m 256 -y -s 1024M -D -R $DIR -c $BACKUPDIR/diffbackup_`date -I` -A ${PREV%%.*} | logger -t DAR
        echo "Rsync kezdete" | logger -t DAR
        rsync -vaurxH --bwlimit=$RSYNCBWLIMIT  --rsh  'ssh -p $RSYNCPORT' $BACKUPDIR $RSYNCUSER@$RSYNCHOST:~/$REMOTEBACKUPDIR | logger -t DAR
fi
echo "Rsync vege" | logger -t DAR


A szkript átalakítva havi teljes mentéssel

Bashban a hónap első szombatját így kalkuláljuk ki:
ncal | awk '{ if ( NR == 7) print $2}'
Bashban a hónap első szombatját így kalkuláljuk ki:
ncal | awk '{ if ( NR == 8) print $2}'

Csak megjegyzésként: az ncal egy konzolos naptár, ami ilyenkor hasznos tud lenni.

A date +%e a hónap napját mondja meg úgy, hogy az ha kisebb, mint 10, nincs kitöltve 0-val.

Innen már egyszerű a dolgunk. Íme a szkript, ami teljes mentést végez minden hónap első szombatján, egyébként differenciális mentést:

#!/bin/bash

DIR=/opt/zimbra/ # ezt mentjük
BACKUPDIR=/backup/dar # ide mentjük a helyi DAR fájlokat
REMOTEBACKUPDIR=backup/ #ide mentjük a távoli gépre

RSYNCUSER=REMOTEUSER
RSYNCHOST=REMOTEHOST
RSYNCPORT=3222
RSYNCBWLIMIT=1024
FIRSTSUNDAYOFTHEMONTH=`ncal | awk '{ if ( NR == 7) print $2}'`
DAYCOUNT=`date +%e`
PREV=`ls -1tr $BACKUPDIR/dar/*.dar | tail -n 1`

# Ha nem fut le 1 óra alatt, akkor visszafogjuk az erőforrás használatát
sleep 3600 && renice 10 -p `pgrep dar` | logger -t DAR &

if [ $DAYCOUNT -eq $FIRSTSUNDAYOFTHEMONTH ]
then
        echo "teljes mentes" | logger -t DAR
        dar -w -m 256 -y -s 1024M -D -R $DIR -c $BACKUPDIR/fullbackup | logger -t DAR
        find $BACKUPDIR/ -mtime +31 -exec rm -f {} \;
        find $BACKUPDIR/ -name 'diffbackup*' -exec rm -f {} \;
        echo "Rsync kezdete" | logger -t DAR
        rsync -vaurxH --delete --bwlimit=$RSYNCBWLIMIT  --rsh  'ssh -p $RSYNCPORT' $BACKUPDIR $RSYNCUSER@$RSYNCHOST:~/$REMOTEBACKUPDIR | logger -t DAR
else
        echo "differencialis mentes" | logger -t DAR
        dar -w -m 256 -y -s 1024M -D -R $DIR -c $BACKUPDIR/diffbackup_`date -I` -A ${PREV%%.*} | logger -t DAR
        echo "Rsync kezdete" | logger -t DAR
        rsync -vaurxH --bwlimit=$RSYNCBWLIMIT  --rsh  'ssh -p $RSYNCPORT' $BACKUPDIR $RSYNCUSER@$RSYNCHOST:~/$REMOTEBACKUPDIR | logger -t DAR
fi
echo "Rsync vege" | logger -t DAR



Kulcsszavak: mentés, backup, dar, differenciáls, teljes mentés

Új hozzászólás: