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)