EddieTheEagle 0 Geschrieben 6. Dezember 2015 Melden Teilen Geschrieben 6. Dezember 2015 Hallo zusammen, ich habe folgendes Problem. Einmal am Tag wird eine Sicherung einer SQL Datenbank durchgeführt. Diese möchte ich täglich durch einen Job auf ein NAS Laufwerk kopieren. Bist dahin nicht schwer, Robocopy macht das super. Jetzt würde ich aber an die Datei, die kopiert wird gerne das Datum anhängen. Die kopierte Datei soll 7 Tage im Zielordner verbleiben. Wenn Robocopy am 8. Tag wieder eine Sicherung durchfürt, soll die älteste Datei gelöscht werden, so das ich immer 7 Backups dieser Datei habe. Ich hoffe, ihr könnt mir helfen. Gruß Eddie Zitieren Link zu diesem Kommentar
XP-Fan 217 Geschrieben 6. Dezember 2015 Melden Teilen Geschrieben 6. Dezember 2015 Hallo, schau mal hier sollte dir helfen: http://www.horstmuc.de/wbat32d.htm Zitieren Link zu diesem Kommentar
Sanches 22 Geschrieben 6. Dezember 2015 Melden Teilen Geschrieben 6. Dezember 2015 Hallo Eddie, du könntest versuchen, einfach vor dem Robocopy Lauf im Script eine Suche mit "forfiles" zu machen. Bsp: forfiles -p "D:\Pfad\wo\auch\immer" -s -m *.* /D -8 /C "cmd /c del @path" Gruß Sebastian Zitieren Link zu diesem Kommentar
GuentherH 61 Geschrieben 6. Dezember 2015 Melden Teilen Geschrieben 6. Dezember 2015 Hallo, und schön dass du uns gefunden hast. Mit Robocopy wird das nicht so einfach gehen. Ich würde nach dem Kopieren den Befehl forfiles verwenden und die älteren Dateien löschen: @echo off SET DEST=\\nas\backup forfiles /p %DEST% /s /m *.bak /d -7 /c "cmd /c echo @file @fdate" > c:\admin\deloldfiles.txt forfiles /p %DEST% /s /m *.bak /d -7 /c "cmd /c del @file" Das 1. Forfile schreibe die zu löschenden Dateien in ein Textfile. Der 2. Forfile Befehl löscht die *.bak Dateien, die älter als 7 Tage sind. LG Günther Zitieren Link zu diesem Kommentar
EddieTheEagle 0 Geschrieben 6. Dezember 2015 Autor Melden Teilen Geschrieben 6. Dezember 2015 Hi, das ging aber schnell :thumb1: Vielen Dank für die schnelle Hilfe. Mit Forfile klappt das schon mal super. Allerding werden auch Dateien im Unterverzeichniss gelöscht. Das müsste ich noch verhindern. Was mir auch noch nicht ganz klar ist, wie ich beim Sichern mit Robocopy das Datum anhängen kann, wobei es jetzt noch nicht mal mehr das Datum sein muss. Ich muss halt nur verhindern, das beim täglichen Backup die Sicherunng vom Vortag nicht überschrieben wird. Gruß Eddie Zitieren Link zu diesem Kommentar
XP-Fan 217 Geschrieben 6. Dezember 2015 Melden Teilen Geschrieben 6. Dezember 2015 Hallo, wie lautet denn deine Zeile mit Robocopy ? Zitieren Link zu diesem Kommentar
EddieTheEagle 0 Geschrieben 6. Dezember 2015 Autor Melden Teilen Geschrieben 6. Dezember 2015 "C:\WINDOWS\system32\robocopy.exe" "J:\backup" "Y:\test" /E Zitieren Link zu diesem Kommentar
Sunny61 807 Geschrieben 6. Dezember 2015 Melden Teilen Geschrieben 6. Dezember 2015 (bearbeitet) Ich hab so etwas ähnliches hier für SQL Express Instanzen im Einsatz. SQL Script um die Sicherung incl. Dateinamen zu erstellen: DECLARE @path VARCHAR (250) SET @path = 'C:\Program Files\Microsoft SQL Server\MSSQL11.TFSEXPRESS\MSSQL\Backup\Tfs_Configuration_' + CONVERT (VARCHAR (8), GETDATE ( ), 112) + '.bak' BACKUP DATABASE [Tfs_Configuration] TO DISK = @path WITH INIT, NAME = N'Tfs_Configuration_Sicherung' DECLARE @pathLOG VARCHAR (250) SET @pathLOG = 'C:\Program Files\Microsoft SQL Server\MSSQL11.TFSEXPRESS\MSSQL\Backup\Tfs_Configuration_log_sich' + CONVERT (VARCHAR (8), GETDATE ( ), 112) + '.bak' BACKUP LOG [Tfs_Configuration] TO DISK = @pathlog WITH INIT, NAME = N'Tfs_Configuration_Log_Sicherung' Die Pfade kannst Du anpassen und die Datenbanknamen MUSST Du anpassen. Alte Dateien automatisch löschen lassen und in eine TXT schreiben. Das Script ist nicht von mir, ich habe es gefunden und leicht angepasst. 'Script zu löschen von Dateien mit bestimmten Dateiendung und wenn Dateien älter als X Tage sind. Dim fso, folder, files, sFolder, sFolder2, sFolderTarget, objFile, strDateiname Set fso = CreateObject("Scripting.FileSystemObject") 'location of the database backup files sFolder = "\\SERVER\c$\Program Files\Microsoft SQL Server\MSSQL11.TFSEXPRESS\MSSQL\Backup\" sFolder2 = "\\SERVER\c$\Program Files\Microsoft SQL Server\MSSQL11.TFSEXPRESS\MSSQL\JOBS\" Set folder = fso.GetFolder(sFolder) Set files = folder.files 'used for writing to textfile - generate report on database backups deleted Const ForAppending = 8 Const ForWriting = 2 'Prüfen ob es die Log.txt schon gibt, wenn nein, erstellen und gleich wieder schliessen. 'Ansonsten wird der Zugriff beim weiteren schreiben verweigert. If fso.FileExists(sFolder2 & "Log.txt") Then 'Datei ist vorhanden und wird gelöscht, anschließend wieder neu erstellt und geschlossen. fso.DeleteFile (sFolder2 & "Log.txt") Set strDateiname = fso.CreateTextFile(sFolder2 & "Log.txt") strDateiname.Close Else 'Datei ist NICHT vorhanden und wird neu erstellt und geschlossen. Set strDateiname = fso.CreateTextFile(sFolder2 & "Log.txt") strDateiname.Close End If 'Datei zum schreiben öffnen Set objFile = fso.OpenTextFile(sFolder2 & "Log.txt", ForWriting, TristateUseDefault) objFile.Write "================================================================" & vbCrLf & vbCrLf objFile.Write " Bericht über gelöschte Datenbank Backup Dateien " & vbCrLf objFile.Write " Datum: " & FormatDateTime(Now(), 1) & "" & vbCrLf objFile.Write " Uhrzeit: " & FormatDateTime(Now(), 3) & "" & vbCrLf & vbCrLf objFile.Write "================================================================" & vbCrLf Dim itemFiles, sDateiname, sEndung 'iterate thru each of the files in the database backup folder For Each itemFiles In files 'retrieve complete path of file for the DeleteFile method and to extract 'file extension using the GetExtensionName method sDateiname = sFolder & itemFiles.Name 'retrieve file extension sEndung = fso.GetExtensionName(sDateiname) 'check if the file extension is BAK If UCase(sEndung) = "BAK" Then 'check if the database backups are older than 5 days If DateDiff("d", itemFiles.DateCreated, Now()) >= 5 Then 'Delete any old BACKUP files to cleanup folder fso.DeleteFile sDateiname objFile.WriteLine "Datei gelöscht: " & sDateiname End If End If Next objFile.WriteLine "================================================================" & vbCrLf & vbCrLf objFile.Close Set objFile = Nothing Set fso = Nothing Set folder = Nothing Set files = Nothing Und jetzt das ganze noch in einer Batch verpackt, die Du dann auf dem Server als geplante Aufgabe ausführen lassen kannst: REM Backupscript für alle Datenbanken der Instanz SERVER\TFSEXPRESS REM Das Script wird aus dem Taskplaner auf SERVER aufgerufen. cd "C:\Program Files\Microsoft SQL Server\110\Tools\Binn" "C:\Program Files\Microsoft SQL Server\110\Tools\Binn\SQLCMD.EXE" -E -S SERVER\TFSEXPRESS -i "C:\Program Files\Microsoft SQL Server\MSSQL11.TFSEXPRESS\MSSQL\JOBS\TFS_FullBackup.sql" cd "C:\Program Files\Microsoft SQL Server\MSSQL11.TFSEXPRESS\MSSQL\JOBS" cscript.exe alte_dateien_loeschen.vbs del \\NAS\Sicherung\TFS\*.bak xcopy "C:\Program Files\Microsoft SQL Server\MSSQL11.TFSEXPRESS\MSSQL\Backup\*.bak" \\NAS\edv\Sicherung\TFS /S /E /Y bearbeitet 6. Dezember 2015 von Sunny61 Zitieren Link zu diesem Kommentar
EddieTheEagle 0 Geschrieben 6. Dezember 2015 Autor Melden Teilen Geschrieben 6. Dezember 2015 (bearbeitet) Hi, mit Robocopy scheine ich das nicht hinzubekommen. Also hab ich mal mit copy gearbeitet. Das funktioniert soweit. Wobei mir eine Lösung mit Robocpy doch besser gefallen würde. @Echo off set /a stunde=%time:~0,2% set minute=%time:~3,2% set sekunde=%time:~6,2% @Echo off copy /V "L:\My Virtual Machines\w2kws.zip" "Y:\test\w2kws-%date%-%stunde%_%minute%_%sekunde%.zip" SET DEST="Y:\test" forfiles /p %DEST% /s /m *.* /d -7 /c "cmd /c echo @file @fdate" > D:\tmp\deloldfiles.txt forfiles /p %DEST% /s /m *.* /d -7 /c "cmd /c del @file" Gruß Eddie bearbeitet 6. Dezember 2015 von EddieTheEagle Zitieren Link zu diesem Kommentar
Sunny61 807 Geschrieben 6. Dezember 2015 Melden Teilen Geschrieben 6. Dezember 2015 Mit Laufwerksbuchstaben arbeitet man an dieser Stelle einfach nicht. Immer den UNC-Pfad verwenden. Zitieren Link zu diesem Kommentar
EddieTheEagle 0 Geschrieben 6. Dezember 2015 Autor Melden Teilen Geschrieben 6. Dezember 2015 (bearbeitet) Hi, erst mal Danke für dein Script. Leider unterstützt forfiles keine UNC Pfade. Aber ich werde mal versuchen dein Script anzupassen, fällt mir aber gerade nicht leicht, sind noch Bömische Dörfer. Das Sichern der SQL Datenbank bräuchte ich nicht, da der Job schon erledigt ist. Ich müsste halt die schon gesicherte Datenbank auf das NAS kopieren, was auch nicht das Problem ist. Mir ist noch nicht ganz klar, was dein Script macht. Pfade angepasst und als alte_dateien_loeschen.vbs gespeichert. 'Script zu löschen von Dateien mit bestimmten Dateiendung und wenn Dateien älter als X Tage sind. Dim fso, folder, files, sFolder, sFolder2, sFolderTarget, objFile, strDateiname Set fso = CreateObject("Scripting.FileSystemObject") 'location of the database backup files sFolder = "\\Eddies-PC\l$\Backup\" sFolder2 = "\\Eddies-PC\l$\Backup\JOBS\" Set folder = fso.GetFolder(sFolder) Set files = folder.files 'used for writing to textfile - generate report on database backups deleted Const ForAppending = 8 Const ForWriting = 2 'Prüfen ob es die Log.txt schon gibt, wenn nein, erstellen und gleich wieder schliessen. 'Ansonsten wird der Zugriff beim weiteren schreiben verweigert. If fso.FileExists(sFolder2 & "Log.txt") Then 'Datei ist vorhanden und wird gelöscht, anschließend wieder neu erstellt und geschlossen. fso.DeleteFile (sFolder2 & "Log.txt") Set strDateiname = fso.CreateTextFile(sFolder2 & "Log.txt") strDateiname.Close Else 'Datei ist NICHT vorhanden und wird neu erstellt und geschlossen. Set strDateiname = fso.CreateTextFile(sFolder2 & "Log.txt") strDateiname.Close End If 'Datei zum schreiben öffnen Set objFile = fso.OpenTextFile(sFolder2 & "Log.txt", ForWriting, TristateUseDefault) objFile.Write "================================================================" & vbCrLf & vbCrLf objFile.Write " Bericht über gelöschte Datenbank Backup Dateien " & vbCrLf objFile.Write " Datum: " & FormatDateTime(Now(), 1) & "" & vbCrLf objFile.Write " Uhrzeit: " & FormatDateTime(Now(), 3) & "" & vbCrLf & vbCrLf objFile.Write "================================================================" & vbCrLf Dim itemFiles, sDateiname, sEndung 'iterate thru each of the files in the database backup folder For Each itemFiles In files 'retrieve complete path of file for the DeleteFile method and to extract 'file extension using the GetExtensionName method sDateiname = sFolder & itemFiles.Name 'retrieve file extension sEndung = fso.GetExtensionName(sDateiname) 'check if the file extension is BAK If UCase(sEndung) = "BAK" Then 'check if the database backups are older than 7 days If DateDiff("d", itemFiles.DateCreated, Now()) >= 7 Then 'Delete any old BACKUP files to cleanup folder fso.DeleteFile sDateiname objFile.WriteLine "Datei gelöscht: " & sDateiname End If End If Next objFile.WriteLine "================================================================" & vbCrLf & vbCrLf objFile.Close Set objFile = Nothing Set fso = Nothing Set folder = Nothing Set files = Nothing test.cmd und alte_dateien_loeschen.vbs liegt im gleichen Ordner @Echo off set /a stunde=%time:~0,2% set minute=%time:~3,2% set sekunde=%time:~6,2% cscript.exe alte_dateien_loeschen.vbs del \\192.168.178.50\home\test\*.bak @Echo off copy /V "\\Eddies-PC\l$\Backup\SQL_Datenbank.bak" "\\192.168.178.50\home\test\SQL_Datenbank-%date%-%stunde%_%minute%_%sekunde%.bak" hier der Aufruf als test.cmd, wobei jetzt alle *bak im Ordner \\192.168.178.50\home\test\ gelöscht werden, egal wie alt sie sind. Irgendwie auch klar mit dem del Befehl. Das script legt das log an, aber es wird keine Aktion reingeschrieben. Bin ein wenig verwirrt. Helft mir doch bitte auf die Sprünge. Gruß Eddie bearbeitet 6. Dezember 2015 von EddieTheEagle Zitieren Link zu diesem Kommentar
Sunny61 807 Geschrieben 6. Dezember 2015 Melden Teilen Geschrieben 6. Dezember 2015 Wenn Du ein Script bekommst solltest Du es zuerst richtig debuggen können. Ein VB-Script kann man mit VBA in einem Office Programm, Excel, Word oder Access debuggen. Alternativ natürlich auch mit einer IDE für VB-Scripte. Dabei sieht man dann viel mehr. Inhalte von Variablen und kann so viel besser verstehen was wann passiert. In sFolder = "\\Eddies-PC\l$\Backup\" wird das Verzeichnis der Variablen zugewiesen. Liegen denn in diesem Verzeichnis auch die *.BAK-Dateien? Wenn ja, hat der ausführende Benutzer denn auch Leserechte auf den Pfad? Wo landest Du wenn Du den Pfad im Explorer in die Adresszeile einfügst und mit ENTER bestätigst? Bedenke! Wenn der ausführende Benutzer ein anderer ist, kann es leicht sein dass der LW-Buchstabe L:\ in dessen Kontext nicht vorhanden ist. Zitieren Link zu diesem Kommentar
EddieTheEagle 0 Geschrieben 6. Dezember 2015 Autor Melden Teilen Geschrieben 6. Dezember 2015 (bearbeitet) OhHa, debuggen wäre dann meine nächste Baustelle. :confused: cscript.exe /x alte_dateien_loeschen.vbs Aufruf um MVS Debugger zu starten. Ausgabe des Debuggers, wenn ich das alles richtig gemacht habe. Aufrufliste: hier bleibt das Script stehen > VBScript global code [alte_dateien_loeschen.vbs] Zeile 4 Ausgabe: "cscript.exe" (Skript): "Skriptcode (C:\WINDOWS\system32\cscript.exe)" geladen.Das Programm "[14860] cscript.exe" wurde mit Code 0 (0x0) beendet. Ich lande im richtigen Verzeichnis. Ich teste auch gerade an meinem Home-PC, deshalb habe ich grade nicht das Problem mit anderen Benutzerkonten. in "\\Eddies-PC\l$\Backup\" liegt die von SQL täglich gesicherte Datenbankdatei, die zum Sichern täglich auf das NAS kopiert wird und dort 7 Tage verbleiben soll. Gruß Eddie bearbeitet 6. Dezember 2015 von EddieTheEagle Zitieren Link zu diesem Kommentar
magheinz 110 Geschrieben 7. Dezember 2015 Melden Teilen Geschrieben 7. Dezember 2015 mv backup.6 backup.7 mv backup.5 backup.6 mv backup.4 backup.5 mv backup.3 backup.4 mv backup.2 backup.3 mv backup.1 backup.2 mv backup.0 backup.1 copy $backup backup.0 Zitieren Link zu diesem Kommentar
Sunny61 807 Geschrieben 7. Dezember 2015 Melden Teilen Geschrieben 7. Dezember 2015 mv backup.6 backup.7 mv backup.5 backup.6 mv backup.4 backup.5 mv backup.3 backup.4 mv backup.2 backup.3 mv backup.1 backup.2 mv backup.0 backup.1 copy $backup backup.0 Was genau möchtest Du mit den Zeilen der Welt mitteilen? Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.