Backup sind lästig, aber wenn sie funktinieren, hat man entgültig seine Ruhe.
ich habe mir ein Script gebastelt, dass auf eine Funktion von rsync aufsetzt.
Gibt man rsync ein Referenz-Verzeichnis, so macht es nur eine Kopie, wenn sich die Datei geändert hat. Bei Dateien ohne änderung macht er einen hardlink auf die alte Datei.
Vorteil: Inkrementelles Backup (Datengröße), aber trotzdem ein FullBackup
Nachteil: Das Alter der Daten kann nicht bestimmt werden (mit find
kann man alte Daten nicht löschen)
Deshalb wurde eine Datenbankdatei eingefügt, anhand derer die alten Daten gelöscht werden.
#!/bin/bash backupdir="/backups_with_db/" datum_jetzt=`date +%F_%H-%M-%S` #Backup-Verzeichnis erstellen (falls es nicht vorhanden ist) if [ ! -d $backupdir ] then mkdir -p $backupdir fi #Aufruf: backup <Quelle> <Ziel> #Idee des Gefechts: #rsync hat die Option (--link-dest), nur die Aenderungen zu speichern #Dazu muss man aber das zwie Verzeichnisse angeben, ein Backup-Verzeichnis, und eins, in dem die alten daten liegen #Wenn man am Ende des Syncs einen symbolischen Link legt (mit Namen lastbackup), kann man beim naechsten sync diesen stischen Namen als Basis verwinden function backup(){ src=$1 dest=$2 #Sollte Verzeichnis nicht existieren, wird es angelegt if [ ! -d $dest ] then mkdir -p $dest fi #temporaeres Verzeichnis fuer den ersten sync if [ `ls $dest | wc -l` = 0 ] then mkdir $dest/temp ln -s $dest/temp $dest/lastbackup fi #erstellen des aktuellen Backu-Verzeichnisses mkdir -p $dest/$datum_jetzt #Schreiben des Counters (fuer etwaige Loeschungen) echo "$dest/$datum_jetzt" >> $dest/backup_counter.log ####### Eigentlicher Sync (Backup) ######### rsync -a --link-dest=$dest/lastbackup $src $dest/$datum_jetzt #Link vom alten Backup loesen und auf aktuelles Verzeichnis setzen unlink $dest/lastbackup ln -s $dest/$datum_jetzt $dest/lastbackup #Das temporaere Verzeichnis wird (falls vorhanden) geloescht if [ -d $dest/temp ] then rm -r $dest/temp fi } #Aufruf: delete_old <Pfad> <counterfile> #Idee des Gefechts #im Pfad befindet sich eine Datei mit den Namen aller Backups. #es werden <age> Stueck behalten. Alles was vorher war, wird geloescht #Vorsicht!!!: Age heist nicht Alte in Tagen! Age / Aufrufe pro Tag = Tage function delete_old(){ #Anzahl der Backups, die Auf der Platte bleiben Default=30 age=180 path=$1 counter_file=$2 # Verzeichnisse aus backup_counters.log suchen, die aelter als <age> sind und dann nach und nach loeschen for directory in `head -n -$age $path/$counter_file` do #Loeschen des Verzeichnisses #echo -e $directory rm -r $directory done #Loeschen der Verzeichnisse aus der counter-Datei selbst cp $path/$counter_file $path/dummy tail -n $age $path/dummy > $path/$counter_file rm $path/dummy } #Aufruf: backup_database <Datenbank> <Zielverzeichnis> #Funktion, um eine Datenbank zu sichern. Dabei kann man die maximale Anzahl an Backups angeben backup_database(){ database=$1 dest=$2 #Sollte Verzeichnis nicht existieren, wird es angelegt if [ ! -d $dest ] then mkdir -p $dest fi #Backup der Datenbank mysqldump --host=localhost --user=root --password=<Passwort> --databases --add-drop-database $database | bzip2 -9 > $dest/$database_$datum_jetzt.txt.bz2 #mysqldump --host=localhost --user=root --password=<Passwort> --databases --add-drop-database $database > $dest/$database_$datum_jetzt.txt.bz2 #Counter fuer loeschung setzen echo "$dest/$database_$datum_jetzt.txt.bz2" >> $dest/database_counter.log } echo -e "Backup owncloud" #Datenverzeichnisse werden gesichert backup "/var/www/owncloud/" "$backupdir/owncloud/" #Alle File-Backups, die älter als x sind, werden geloescht delete_old "$backupdir/owncloud/" "backup_counter.log" #Datenbank wird gesichert backup_database owncloud "$backupdir/owncloud" #alle Datenbank-Backups, die aelter als x sind, werden geloescht delete_old "$backupdir/owncloud/" "database_counter.log"