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