Backup script - Fragen zu mailversand

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
r4pt0r
Beiträge: 1237
Registriert: 30.04.2007 13:32:44
Lizenz eigener Beiträge: MIT Lizenz

Backup script - Fragen zu mailversand

Beitrag von r4pt0r » 13.01.2012 10:42:18

Für das Backup von MSSQL-Datenbankdumps (.bak) habe ich folgende Backup-Strategie:

Windows-Server (in einer VM) mit MSSQL Server erstellt täglich um 0:00 ein backup der 5 laufenden Datenbanken, die .bak dateien mit jeweils ~4GB werden in einem Lokalen Ordner 5 Tage vorgehalten

Täglich um 0:30 kopiert ein Synctool die Sicherungen auf einen Debian-fileserver. Dieser läuft in einer zweiten VM auf dem selben Hostsystem - Übertragungsgeschwindigkeit ist also kein Problem. Das Synctool prüft die geschriebenen Daten auf Konsistenz.

Nun kommt ein Shellscript zum Einsatz, das Täglich um 1:00 dann die Dateien in einem Vorgegebenen Pfad durchsucht, abgleicht ob eine zugehörige gepackte Sicherung (tar.gz) auf dem Zielpfad (NAS per nfs gemountet) vorhanden ist, erstellt ggf die Ordnerstruktur falls diese erweitert wurde, packt die noch nicht gesicherten .bak Dateien und kopiert sie. Danach werden die MD5 Prüfsummen verglichen, wenn identisch wird das Lokle Archiv gelöscht, ansonsten werden bis zu 3 neue Kopierversuche unternommen.

Anschließend werden in Quell- und Zielverzeichnis alle Dateien älter als 5 Tage gelöscht.

Hier das bisher laufende Script das gestern entstanden ist:

Code: Alles auswählen

#!/bin/bash

inputDir="/fileserver/2k8srv_backup/w2k8_32/"
outputDir="/mnt/nas/backups/"
logfile="/var/log/backup.log"

ordnerNeu=0
dateienGesichert=0
nichtGesichert=0



(	# gehört zu tee $logfile  -> komplette ausgabe per tee umleiten



## neuer abschnitt in Logdatei

echo "#####     Backup gestartet am $(date +%x"  "%X)     #####" 
echo




## Ordnerstruktur auf Ziel prüfen, ggf erstellen

find $inputDir -type d | while read ordnerstruktur
do
	ziel=${ordnerstruktur/$inputDir/$outputDir}

	if [[ ! -d $ziel  &&  $ziel != $outputDir ]]; then
		mkdir $ziel
		echo "$(date +%X)      $ziel nicht vorhanden, wurde neu Erstellt"
		let "ordnerNeu+=1"
	fi 	
done




## Daten mit ziel abgleichen, wenn nicht vorhanden packen, kopieren, md5 checksum prüfen, lokale tar löschen

find $inputDir -name "*.bak" | while read bakDatei					# erstelle Liste aller Dateien mit .bak
do
   lokaleTar=$(dirname $bakDatei)/$(basename $bakDatei .bak).tar.gz			# dateiendungen austauschen .bak -> .tar
   zielDatei=${lokaleTar/$inputDir/$outputDir}						# dateipfad ersetzen inputDir -> outputDir

   if [ ! -f $zielDatei ]; then								# prüfen ob tar-sicherung vorhanden
	
	echo "$(date *%X)      $bakDatei noch nicht gesichert, Packe zu .tar.gz"

	counter=0

	while [[ $? -ne 0  &&  $counter -le 3 ]]; do
	let "counter+=1"
	tar czf $lokaleTar $bakDatei					# quelldatei packen + komprimieren
	done
	
	echo "$(date +%X)      Kopiere nach $zielDatei"
	cp  $lokaleTar $zielDatei							# tar kopieren
	echo "$(date +%X)      $bakDatei nach $zielDatei gesichert"
	echo "$(date +%X)      Vergleiche Checksummen von Original und Kopie."
	md5lokal=$(md5sum --binary $lokaleTar)
	md5ziel=$(md5sum --binary $zielDatei)

	if [ ${md5lokal:0:32} = ${md5ziel:0:32} ]; then
		echo "$(date +%X)      MD5 Prüfsummen identisch, lösche lokales Archiv"
		rm $lokaleTar
		let "dateienGesichert+=1"
	else
	
		counter=0
	
		while [[ ${md5lokal:0:32} != ${md5ziel:0:32}  &&  $counter -le 3 ]]; do
			let "counter+=1"	
			echo "$(date +%X)      MD5 Prüfsummen von $(basename $zielDatei)  UNGLEICH, kopiere sicherung erneut"
			cp -f $lokaleTar $zielDatei >> $lofile
			md5ziel=$(md5sum --binary $zielDatei)			
		done
				
		md5ziel=$(md5sum --binary $zielDatei)

		if [ ${md5lokal:0:32} == $ {md5ziel:0:32} ]; then
			echo "$(date +%X)      MD5 Prüfsummen identisch, lösche lokales Archiv"
			rm $lokaleTar
			let "dateienGesichert+=1"
		else	
			echo "$(date +%X)  WW  $(basename $zielDatei) $counter mal fehlerhaft übertragen, behalte lokales Archiv und setze Sicherungen fort. Entferne fehlerhafte Sicherung."
			rm $zielDatei
			let "nichtGesichert+=1"
		fi

	fi
	

    else
	echo "$(date +%X)      $bakDatei wurde bereits gesichert"
  fi

done

echo
echo "Suche nach veralteten Sicherungen"
echo


##  Nach Backups älter als 5 Tage suchen und löschen

find $inputDir -mtime +5 | while read oldfile
do
	if [ -f $oldfile]; then
	echo "$oldfile älter als 5 Tage, wird entfernt"
#	rm $oldfile
	let "geloescht+=1"
	fi
done

find $outputDir -mtime +5 | while read oldfile
do
	if [ -f $oldfile ]; then
	echo "$oldfile älter als 5 Tage, wird entfernt"
#	rm $oldfile
	let "geloescht+=1"
	fi
done


echo
echo
echo "Zusammenfassung:"
echo "Neu erstellte Ordner:            $ordnerNeu"
echo "Dateien gesichert:               $dateienGesichert"
echo "Nicht gesicherte Dateien:        $nichtGesichert"
echo
echo "Del Fin"
echo
echo


) | tee -a $logfile


Das ganze ist noch nicht 100% ausgegoren und es fehlt noch die email-Benachrichtigung bei Fehlern bzw Statusreport mit angehängter Logdatei. Zudem will ich noch die exit-codes aller genutzten programme auswerten - das ganze soll "maximal failsafe" laufen.

Um Fragen/Anregungen/Verbesserungsvorschläge wird gebeten ;)

Wer das Script nützlich findet darf es natürlich auch gerne weiterverwenden :)


Nun zur Mailbenachrichtigung:
Der Server läuft in einem Netzwerk mit Internetanbindung - ein Server für web/maildienste läuft ausserhalb in einem Rechenzentrum (root-server). Diesen Mailserver würde ich gerne für den Mailversand des Netzwerkservers nutzen. Wie lässt sich sowas am einfachsten bewerkstelligen?
Den exim vom LAN-Server umbiegen damit er den externen als relay nutzt? Oder gehts auch "quick&dirty" nur um Statusberichte vom Server rauszuschicken? (Die Rechner aus dem LAN greifen direkt auf den Mailserver zu, daran soll auch nichts geändert werden - ein lokaler Mailserver/Gateway lohnt sich nicht bei so wenigen Clients, zumal dann die Aussenstellen die per VPN angebunden sind diese ohnehin schwache Leitung noch mehr belasten würden)

ralfi
Beiträge: 285
Registriert: 02.06.2011 11:16:11
Wohnort: Brandenburg

Re: Backup script - Fragen zu mailversand

Beitrag von ralfi » 13.01.2012 11:18:39

Ich benutze sendEmail (Perl-Script) für solche Dinge
Viele Grüße, ralfi

Niveau sieht von unten oft wie Arroganz aus ...

Antworten