Jump to content

Datei täglich kopieren und 7 Tage vorhalten


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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

Link zu diesem Kommentar

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

Link zu diesem Kommentar

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

 

Link zu diesem Kommentar

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 von Sunny61
Link zu diesem Kommentar

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 von EddieTheEagle
Link zu diesem Kommentar

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 von EddieTheEagle
Link zu diesem Kommentar

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.

Link zu diesem Kommentar

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 von EddieTheEagle
Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...