signum21
Goto Top

Datensicherung mit Robocopy - Automatische Löschung von Alt-Backups gegen Speicherplatzmangel

Hallo Leute

Kann mir bitte jemand weiterhelfen?

ich sichere meine Daten schön nach Datum sortiert auf zwei USB-Festplatten.

Ich verwende zwei Platten weil ich eine Platte immer an einen anderen Ort aufbewahren möchte (Stichworte: Diebstahl, Brandfall, Blitzeinschlag, Wasserschaden ...)

Ich habe bereits vor längerer Zeit eine Batch zusammengebastelt, aber diese funktioniert mittlerweile nicht mehr zuverlässig weil die Datenmenge ständig zunimmt.

Provisorisch hatte ich bereits eine Löschung von Altverzeichnissen erstellt aber diese berücksichtigt nicht den Speicherplatz!

Auf den USB-Festplatten werden die Daten aus der Quelle immer komplett in einen neuen Ordner im Format: 2015-04-24 gepackt

Ich suche eine Lösung die automatisch überprüft ob auf der Backup-Platte aktuell genug Platz vorhanden ist. Wenn der Platz nicht reicht soll das älteste Verzeichnis automatisch gelöscht werden und nochmals geprüft werden. Bis der Speicherplatz endlich für's Backup reicht...

Leider hab ich nicht genug Erfahrung um so eine Lösung zu realisieren.


Hier meine provisiorisch gebastelte Batch-Datei.

1.Block: Datum ermitteln und umschreiben nach JJJJ-MM-TT sowie provisorische Lösch-Tage/Monate setzen
2.Block: Altdaten löschen nach in Block 1 gesetzten Vorgaben
3.Block: Datensicherung mit Robocopy
_________________________________________
echo off
setlocal
set "datum=%date:~-4%-%date:~-7,2%-%date:~-10,2%"
set "monat=%date:~-7,2%"
set "delj=%date:~-4%"
IF "%monat%"=="01" set "delm=12"
IF "%monat%"=="01" set "delj=2016"
IF "%monat%"=="02" set "delm=01"
IF "%monat%"=="03" set "delm=02"
IF "%monat%"=="04" set "delm=03"
IF "%monat%"=="05" set "delm=04"
IF "%monat%"=="06" set "delm=05"
IF "%monat%"=="07" set "delm=06"
IF "%monat%"=="08" set "delm=07"
IF "%monat%"=="09" set "delm=08"
IF "%monat%"=="10" set "delm=09"
IF "%monat%"=="11" set "delm=10"
IF "%monat%"=="12" set "delm=11"
set "tag=%date:~-10,2%"
IF "%tag%"=="01" set "delt=0"
IF "%tag%"=="02" set "delt=0"
IF "%tag%"=="03" set "delt=0"
IF "%tag%"=="04" set "delt=0"
IF "%tag%"=="05" set "delt=0"
IF "%tag%"=="06" set "delt=0"
IF "%tag%"=="07" set "delt=0"
IF "%tag%"=="08" set "delt=0"
IF "%tag%"=="09" set "delt=0"
IF "%tag%"=="10" set "delt=0"
IF "%tag%"=="11" set "delt=1"
IF "%tag%"=="12" set "delt=1"
IF "%tag%"=="13" set "delt=1"
IF "%tag%"=="14" set "delt=1"
IF "%tag%"=="15" set "delt=1"
IF "%tag%"=="16" set "delt=1"
IF "%tag%"=="17" set "delt=1"
IF "%tag%"=="18" set "delt=1"
IF "%tag%"=="19" set "delt=1"
IF "%tag%"=="20" set "delt=2"
IF "%tag%"=="21" set "delt=2"
IF "%tag%"=="22" set "delt=2"
IF "%tag%"=="23" set "delt=2"
IF "%tag%"=="24" set "delt=2"
IF "%tag%"=="25" set "delt=2"
IF "%tag%"=="26" set "delt=2"
IF "%tag%"=="27" set "delt=2"
IF "%tag%"=="28" set "delt=3"
IF "%tag%"=="29" set "delt=3"
IF "%tag%"=="30" set "delt=3"
IF "%tag%"=="31" set "delt=3"

set "erase=%delj%-%delm%-%delt%"
Setlocal EnableDelayedExpansion
FOR /F %%i in ('dir /b "Z:\Datensicherung\%erase%*"') do (
set Name=%%i && del Z:\Datensicherung\!Name! /F /S /Q && RMDIR Z:\Datensicherung\!Name! /S /Q
)

set quelle=D:\SERVER\DATEN
md Z:\Datensicherung
set ziel=Z:\Datensicherung\%datum%
robocopy.exe "%quelle%" "%ziel%" /XJ /MIR /MT:8 >> "Z:\Datensicherung\Sicherung %datum%.txt"

Content-Key: 270770

Url: https://administrator.de/contentid/270770

Ausgedruckt am: 19.03.2024 um 07:03 Uhr

Mitglied: kaiand1
kaiand1 30.04.2015 um 20:20:18 Uhr
Goto Top
evtl währe ja rsnapshot was für dich.
da kannst du Einstellen wieviele Backups max gemacht werden soll.
Und es Dupliziert beim Backup die Daten per "Symlink" somit verbraucht das Backup weniger Speicherplatz da die selben Daten in allen Ordner vorhanden sind....
Zudem währe ein Raspberry als Backup Server zu überlegen wo du nur Lesezugriff auf die Shares hast und sich das System per SMB die Daten sichert.
So hast du noch den vorteil das wenn dein PC ein Virus ect hat die Backupfiles nicht geändert werden können (Verschlüsselt/Gelöscht).
Mitglied: SIGNUM21
SIGNUM21 30.04.2015 aktualisiert um 23:56:00 Uhr
Goto Top
rsnapshot stellt für mich leider keine Lösung dar.

1. Ich wollte schon in der Windows-Welt bleiben.

2. Es wird damit täglich ein Windows-Server 2008 R2 Datenverzeichnis gesichert und es kommen mehrere GB zusammen die ich nicht gesondert wieder durchs langsame LAN schicken will...

3. Die Anzahl der Backups möchte ich nicht festlegen. Weil die USB-Festplatten sollen evtl. ergänzt oder durch größere getauscht werden können.
Es sollen auf jeder USB-Festplatte immer so viele Sicherungen wie möglich untergebracht werden.
Mitglied: 114757
114757 30.04.2015 aktualisiert um 22:01:58 Uhr
Goto Top
Powershell my friend ...
(hier nur fürs cleanup)
$quelle = 'D:\Server\Daten'  
$ziel = 'Z:\Datensicherung'  

$drive = $ziel.Substring(0,2)
$sizeSource = (gci $quelle -recurse | measure Length -Sum).Sum / 1MB
while (((gwmi "Win32_LogicalDisk" -Filter "DeviceID='$drive'").FreeSpace / 1MB) -lt $sizeSource){  
    gci $ziel | ?{$_.PSIsContainer} | sort CreationDate -Desc | select -First 1 | remove-item -Recurse -Force
}
Gruß jodel32

p.s. rsync gibt auch für Windows face-wink
Mitglied: SIGNUM21
SIGNUM21 30.04.2015 um 23:46:00 Uhr
Goto Top
Dankeschön erstmal!

Ich hab leider keine Ahnung von der PowerShell

Meine uralt-Kenntnisse beziehen sich eher auf MS-DOS 6.22.

Mir ist klar dass die PowerShell ein Nachfolger der CMD-Zeile ist aber das war's schon.

Habe gerade ein wenig versucht das ganze zusammen zu frickeln aber es läuft nicht...

Werde mich wahrscheinlich nie mehr damit beschäftigen müssen, wenn ich die Backup-Batch einmal fertig hätte.

Muss ich mich jetzt wirklich mühselig da rein arbeiten???
Mitglied: nother
nother 30.04.2015 um 23:54:36 Uhr
Goto Top
Mitglied: jsysde
jsysde 01.05.2015 um 10:03:18 Uhr
Goto Top
Moin.
Zitat von @SIGNUM21:
3. Die Anzahl der Backups möchte ich nicht festlegen. Weil die USB-Festplatten sollen evtl. ergänzt oder durch
größere getauscht werden können.
Es sollen auf jeder USB-Festplatte immer so viele Sicherungen wie möglich untergebracht werden.
Das widerspricht aber dem Löschvorgang....

Anyway, um Platz zu sparen könntest du deine Daten auch einfach komprimieren, z.B. mit 7Zip - das spart mit Einstellung "Ultra" und abhängig von den zu komprimierenden Daten bis zu 90% Speicherplatz, kostet dafür aber Rechenzeit und benötigt mehr Zeit.

Dann fällt mir noch DelAge32 ein:
http://www.horstmuc.de/wbat32d.htm

Cheers,
jsysde
Mitglied: 114757
114757 01.05.2015 aktualisiert um 10:21:16 Uhr
Goto Top
Muss ich mich jetzt wirklich mühselig da rein arbeiten???
Warum, zwei Pfade anpassen kann wohl jeder, der Rest bleibt so ... musst du aber selber wissen, aber wer sich hier nur was zusammenstellen lassen will und nichts dabei lernen will ist hier IMHO fehl am Platze. Das Leben besteht nun mal aus lebenslangem Lernen ...
Werde mich wahrscheinlich nie mehr damit beschäftigen müssen, wenn ich die Backup-Batch einmal fertig hätte.
Und beim ersten Fehler gleich wieder hier antanzen, das kennen wir nur zu gut ;-P

Wie man Powershell-Scripte ausführt erklärt @colinardo hier ganz gut:
Ein Script auf einem oder mehreren, entfernten Rechnern ausführen - Wie kann ich es umsetzen ?
Mitglied: SIGNUM21
SIGNUM21 01.05.2015 aktualisiert um 21:59:30 Uhr
Goto Top
...work in progress...
Mitglied: SIGNUM21
SIGNUM21 01.05.2015, aktualisiert am 22.05.2015 um 10:21:24 Uhr
Goto Top
Nur zwei Pfade anpassen brachte mich beim "CleanUp" aber nicht weiter!!! Siehe Fehler unten!

Vielen Dank aber für folgende die Info:
Wie man Powershell-Scripte ausführt erklärt @colinardo hier ganz gut:

Habe bereits ein fertiges Backup-Skript in PowerShell erstellt und werde die Tage beobachten wie es läuft.
Mein Hauptproblem mit der festen Anzahl an Backups habe ich aber immer noch, da dein "CleanUp" mir folgende Fehlermeldungen gibt:

___
PS C:\Users\Administrator> D:\Script.ps1
gci : Der angegebene Pfad und/oder Dateiname ist zu lang. Der vollständig qualifizierte Dateiname muss kürzer
als 260 Zeichen und der Pfadname kürzer als 248 Zeichen sein.
In D:\Script.ps1:5 Zeichen:16

back-to-top$sizeSource = (gci $quelle -recurse | measure Length -Sum).Sum / 1MB

back-to-top~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : ReadError: (D:\Server\Daten...xtensionHandler:String) [Get-ChildItem], PathTooL
ongException
+ FullyQualifiedErrorId : DirIOError,Microsoft.PowerShell.Commands.GetChildItemCommand

gci : Der angegebene Pfad und/oder Dateiname ist zu lang. Der vollständig qualifizierte Dateiname muss kürzer
als 260 Zeichen und der Pfadname kürzer als 248 Zeichen sein.
In D:\Script.ps1:5 Zeichen:16

back-to-top$sizeSource = (gci $quelle -recurse | measure Length -Sum).Sum / 1MB

back-to-top~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : ReadError: (D:\Server\Daten...xtensionHandler:String) [Get-ChildItem], PathTooL
ongException
+ FullyQualifiedErrorId : DirIOError,Microsoft.PowerShell.Commands.GetChildItemCommand

gci : Der Zugriff auf den Pfad "D:\Server\Daten\xyz\Persönliche Daten" wurde verweigert.
In D:\Script.ps1:5 Zeichen:16

back-to-top$sizeSource = (gci $quelle -recurse | measure Length -Sum).Sum / 1MB

back-to-top~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : PermissionDenied: (D:\Server\Daten\xyz\Persönliche Daten:String) [Get-ChildIt
em], UnauthorizedAccessException
+ FullyQualifiedErrorId : DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand
___
Mitglied: 114757
114757 02.05.2015 aktualisiert um 09:11:20 Uhr
Goto Top
Gängiges Problem, die Leute legen einfach zu tiefe Pfade an. Das muss man erst fixen... Deswegen ist dein Batch-Script vermutlich auch gescheitert. Und für die exakte Berechnung der Backup-Größe muss das Script natürlich auf alle Pfade zugreifen dürfen (Account unter dem das Script läuft am besten mit System-Account)
Mitglied: pieh-ejdsch
pieh-ejdsch 04.05.2015 um 20:38:35 Uhr
Goto Top
Moin, ist schon ähnlich
Automatisch Ordner löschen - nach Plattenplatz

Sollte mit RC auch umsetzbar sein.

Gruß Phil