LinuxFanClub wiki

Υπηρεσίες, Προγραμματισμός, Εκπαίδευση ..

User Tools

Site Tools


el:linux:debian:server:incremental_backup

Differentiall backups

Εγκαθιστούμε με

aptitude install rdiff-backup
cd /mnt/sda9/backup/s1
mkdir -p var/lib/mysql
rdiff-backup --print-statistics root@s1::/etc ./etc
rdiff-backup --print-statistics root@s1::/var/lib/mysql/ ./var/lib/mysql
rdiff-backup --print-statistics root@s1::/home ./home

Εάν θέλουμε να βλέπουμε την διαδικασία όπως εκτυλίσσεται ενεργοποιούμε τα μηνύματα εώς ένα επίπεδο 0..9 με την παράμετρο -v, π.χ. -v 6

Μετά από 2 τουλάχιστον backups μπορούμε να δούμε στατιστικά με

rdiff-backup-statistics etc/

Για να δούμε τα αρχεία που τροποποιήθηκαν τις τελευταίες 5 ημέρες

  rdiff-backup --list-changed-since 5D etc/

Άλλες επιλογές χρόνου είναι s, m, h, D, W, M, Y ή B μετρώντας backups

Αν θέλουμε να δούμε την λίστα με τα τελευταία backup

rdiff-backup --list-increments /backup/s2/home

Επαναφορά αρχείου από backup

Εκτελούμε την εντολή

/usr/lib/wad/common2 restore -d 30 -r /etc/gimp

Αναλυτικά σε bash

#!/bin/bash
numofdays="$1" # 30
srcname="$2" # /home/computersantoniou/public_html/www/index.php
 
allchangesfile="/tmp/allchangesfile"
rdiffbackupdir="/backup/$(hostname -s)"
backupdir=/root/tmp/rdiff-restore-$(date -Isec)
backupdest=$backupdir/$(basename $srcname)
 
if [ ! -e "$srcname" ]; then
        echo "$srcname not found, exiting .."
        exit 2
fi
 
rm -rf $backupdir
mkdir -p $backupdir
 
cp -rpf $srcname $backupdest.old # keep current file(s) just in case
echo "retrieving data from $numofdays days version .."
rdiff-backup --force -r $numofdays''D $rdiffbackupdir/$srcname $backupdest.new
echo -e "checking differences.."
sleep 2
#echo "current content < ,   $numofdays days content > "
LANG=en_us diff -r -u $backupdest.old $backupdest.new > $allchangesfile
numofchanges=$(cat $allchangesfile | grep -E '^\+|^\-' | grep -v '++' | wc -l)
numofchangedfiles=$(cat $allchangesfile | grep -E '^\+\+|^Only' | wc -l)
 
if [ "$numofchangedfiles" = "0" ]; then 
        echo -e "\ncurrent contents are equal to $numofdays days version .. exiting"  
        exit 3
fi
echo "Found about $(( $numofchanges/2 )) changes in $numofchangedfiles different files"
 
read -p "Press ENTER to view changes, q to exit from viewer" ans
[ "$ans" != "q" ] && less $allchangesfile
 
read -p "Restore contents from $numofdays days version ?[y/N]" ans
if [ "$ans" = "y" ]; then
        echo -e "\nBackup created to $backupdest.old"
        rm -rf $srcname
        cp -rpf $backupdest.new $srcname # restore 
        echo -e "\n$srcname restored from a $numofdays days version"
else
        echo "restore cancelled" 
fi

Επαναφορά βάσης (φακέλου) από backup

Έστω ότι θέλουμε να επαναφέρουμε τα περιεχόμενα μιας βάσης δεδομένων όπως ήταν μια μέρα πριν. Ειμαστε στον s2 και πέρνουμε από το backup του s1. Λόγω replication τα περιεχόμενα των βάσεων είναι ίδια

rdiff-backup -r 1D /backup/s1/var/lib/mysql/linuxfanclub/ /root/tmp/linuxfanclub/

Για ασφάλεια κρατάμε backup και στους 2 servers τα παλιά αρχεία

cp -rpf /var/lib/mysql/linuxfanclub/ /mysql.bak/

Σταματάμε την mysql και στους 2 servers

/etc/init.d/mysql stop

Τέλος επαναφέρουμε τα περιεχόμενα της βάσης και στους 2 servers

cp -rpf /root/tmp/linuxfanclub/ /var/lib/mysql/
scp -r /root/tmp/linuxfanclub/ s1:/var/lib/mysql/

Τέλος ξαναξεκινάμε και στους 2 servers την mysql

/etc/init.d/mysql start
ssh s1 /etc/init.d/mysql start

Κάνουμε ένα restart και εξετάζουμε το syslog και στους 2 servers για να δούμε ότι το replication ξεκίνησε κανονικά /etc/init.d/mysql restart tail -f /var/log/syslog -n 100

Άλλο παράδειγμα τελικής επαναφοράς όταν έχουμε την έκδοση των αρχείων που θέλουμε σε /root/tmp/computersantoniou_www και την έκδοση της βάσης που θέλουμε σε /root/tmp/computersantoniou_joomla35/

  service apache2 stop
 
  srcfiles=/root/tmp/computersantoniou_www/
  destfiles=/home/computersantoniou/public_html/www
  srcdb=/root/tmp/computersantoniou_joomla35/
  destdb=/var/lib/mysql/computersantoniou_joomla35/
  user=computersantoniou
 
  mv $destfiles  /root/tmp/$(basename $destfiles)_problem; 
  service mysql stop;
  mv $destdb /root/tmp/$(basename $destdb)_problem; 
  mv $srcdb $destdb; 
  service mysql start; 
  mv $srcfiles $destfiles
  chown $user.$user -R $destfiles
  chown mysql.mysql -R $destdb
  chmod g+w -R $destdb
 
  service apache2 start

Αντιμετώπιση Προβλημάτων

Εάν μας βγάλει το μήνυμα

Fatal Error: Bad rdiff-backup-data dir on destination side

τότε διαγράφουμε τον φάκελο rdiff-backup-data και εκτελούμε πάλι την εντολή rdiff-backup αλλά με την παράμετρο –force

Εάν μας βγάλει το μήνυμα

Fatal Error: Previous backup to /backup/home seems to have failed.
Rerun rdiff-backup with --check-destination-dir option to revert directory to state before unsuccessful session.

εκτελούμε

rdiff-backup --check-destination-dir /backup/home

Πηγές

el/linux/debian/server/incremental_backup.txt · Last modified: Y/m/d H:i by vagk