wiki:skripte:backup_with_hardlinks

Backup sind lästig, aber wenn sie funktinieren, hat man entgültig seine Ruhe.

Backup mit rsync

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.

Skript

Es muss noch das mySQL-Passwort eingetragen werden
backup_with_database.sh
#!/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"
Geben Sie Ihren Kommentar ein. Wiki-Syntax ist zugelassen:
   ____ ______   _  __  _____  __  __
  / __//_  __/  | |/_/ / ___/ / / / /
 / _/   / /    _>  <  / /__  / /_/ / 
/_/    /_/    /_/|_|  \___/  \____/
 
  • wiki/skripte/backup_with_hardlinks.txt
  • Zuletzt geändert: 2015/07/10 19:39
  • von wikiadmin