artikeldok arrow Debian Squeeze arrow inkementelle Backups mit rsync auf Debian Squeeze

Inkementelle Backups mit rsync auf Debian Squeeze

rsync kann Verzeichnisse abgleichen und synchronisieren. Dabei werden nur geänderte Dateien, bzw. sogar nur die geänderten Teile einer geänderten Datei übertragen.

Auf den Zielfestplatten (oder Zielrechnern) werden die gesicherten Daten gespeichert und täglich wird eine Kopie der geänderten Dateien gemacht – allerdings nicht physikalisch, sondern die Dateien werden nur in einen neuen Ordner neu verlinkt ("hardlink-copy"). Eine Datei kann damit 20 mal auf der Festplatte existieren, belegt aber nur einmal physikalisch Speicher.

Wird eine Datei geändert, wird rsync diese Änderung übertragen und in die Sicherung einpflegen. Zuvor allerdings löst rsync den Hardlink auf und erzeugt eine neue Kopie der Datei. Sie existiert dann physikalisch zweimal. Man kann deshalb täglich eine neue Backup-Kopie anfertigen, die keinen zusätzlichen Speicherplatz kostet, solange nichts geändert wurde.

Zunächst rsync installieren:

apt-get update
apt-get install rsync

 

Mit folgendem Perl-Skript (datensicherung.pl) können inkementielle Datensicherungen auf einer sepearten Festplatte abgelegt werden. Die Sicherungsfestplatte ist im Beispiel auf /mnt/disk1 gemounted. Es werden die Verzeichnisse /etc und MySQL Datenbank in der Standard-Installation gesichert. Es werden 14 Datensicherungssätze angelegt, die automatisch rotiert werden.

datensicherung.pl: 


#!/usr/bin/perl

#Datensicherung mit rsync
###########################################

#Dienste stoppen
system("/etc/init.d/mysql stop");

# aktueller Tag in deutsch
$today = ('Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag')[ (localtime)[6] ];

#Datum auslesen
(undef,undef,undef,$tag,$monat,$jahr,undef,undef,undef) = localtime(time);

# Datum formatieren
if ($tag < 10){$tag = "0$tag"}
$monat = $monat+1;
if ($monat < 10){$monat = "0$monat"}
$jahr = $jahr+1900;

$RSYNC="/usr/bin/rsync";

#Anzahl Sicherungen
$ANZSICHERUNG=13;

#Logdatei anlegen
$logdatei="/var/log/$jahr-$monat-$tag-$today.log";
system("touch $logdatei");
system("echo Datensicherung von $today, den $tag.$monat.$jahr >> $logdatei");

sub rsyncverz($verzeichnisname,$quellverzeichnis,$FLAGs)
{
$SRC=$quellverzeichnis;
$DEST="/mnt/disk1/$verzeichnisname-b";
#Falls Zielverzeichnis nicht existiert, anlegen
if (not -d "$DEST") {
   system("mkdir $DEST");
}
$DISK="$verzeichnisname-backup";
# letze Sicherung löschen, falls vorhanden
if (-d "$DEST/$DISK.$ANZSICHERUNG") {
         system("rm -rf $DEST/$DISK.$ANZSICHERUNG");
}
#Sicherungen rotieren
for(my $i = $ANZSICHERUNG; $i >= 1; $i--) {
   $b=$i-1;
      if (-d "$DEST/${DISK}.$b") {
         system("mv $DEST/${DISK}.$b $DEST/${DISK}.$i");
      }
}
#Aktuelle Sicherung anlegen
system("mkdir $DEST/${DISK}.0");
system("echo   >> $logdatei");
system("echo   >> $logdatei");
system("echo Quellverzeichnis: $SRC >> $logdatei");
system("echo Zielverzeichnis: $DEST >> $logdatei");
system("echo   >> $logdatei");
system("echo   >> $logdatei");
#Spiegelung mit link-dest flag
system("$RSYNC $FLAGs --link-dest=$DEST/${DISK}.1/. $SRC/. $DEST/${DISK}.0/. >> $logdatei");
system("echo   >> $logdatei");
system("echo   >> $logdatei");
}

#etc
$verzeichnisname="etc";
$quellverzeichnis="/etc";
$FLAGs="-av --delete";
&rsyncverz($verzeichnisname,$quellverzeichnis,$FLAGs);

#mysql
$verzeichnisname="mysql";
$quellverzeichnis="/var/lib/mysql";
$FLAGs="-av --delete";
&rsyncverz($verzeichnisname,$quellverzeichnis,$FLAGs);

#logdatei beenden
system("echo   >> $logdatei");
system("echo   >> $logdatei");
system("fdisk -l >> $logdatei");
system("echo   >> $logdatei");
system("echo   >> $logdatei");

system("/etc/init.d/mysql start");
 

Kern des Skripts datensicherung.pl ist die Subroutine sub rsyncverz. rsyncverz erzeugt auf der Zielfestplatte das Hauptsicheungsverzeichnis (/etc-b).  Innerhalb dieses Vertzeichnisses werden die Backups automatisch rotiert (/etc-b/etc-backup.0, /etc-b/etc-backup.1, /etc-b/etc-backup.2 ...). Die Übergabeparameter "$verzeichnisname,$quellverzeichnis,$FLAGs" werden im 2. Teil des kleinen Skripts definiert.

 Einbinden in crontab (tgl. 02:00 Uhr)

0 2 * * *       root    perl /verzeichnis/datensicherung.pl   >  /dev/nul 2>&1

 
< zurück   weiter >