Backup Script Optimierung und MSSQL
Hiho 
Ich hätt da mal 'ne Frage.
Scenario ist wie folgt: Windows Server 2012 R2 mit IIS und MSSQL 2014.
Alle Webs liegen in C:\IIS Root. Darin (Beispielhaft):
Nun möchte ich per Script alle Dateien kopieren (Temp), diese per 7zip komprimieren (verschlüsselt) und danach an einen FTP Server hochladen.
Das funktioniert auch alles. Aber ich würde es gerne in so weit optimieren dass ich nicht jedes Mal die Batch Datei ändern muss wenn ein weiteres Verzeichnis im \IIS Root hinzu kommt. Also irgendwas For Next ähnliches. Vorzugsweise ohne PowerShell (keine Ahnung warum, ich mag die nicht).
Der Datenbank Teil in dem Script ist noch komplette Baustelle (wird auch noch nicht aufgerufen). Früher habe ich da mit der OSQL.EXE gearbeitet, funktionierte auch, aber in der neuen Version von MSSQL gibt es die ja nicht mehr. Aber auch hier für jede Datenbank ein eigener Eintrag in der Batch. Schöner wäre auch hier mit einem Befehl alle zu sichern. Oder alternativ gleiche DB Namen wie der Ordner zu erzwingen und den nehmen. Wie, egal.
Ich schreib mal das was ich bereits habe hier rein. Domains und Passwörter sind natürlich verfälscht.
Ich hätt da mal 'ne Frage.
Scenario ist wie folgt: Windows Server 2012 R2 mit IIS und MSSQL 2014.
Alle Webs liegen in C:\IIS Root. Darin (Beispielhaft):
\De.Test
\De.Test.Logs (für die IIS Logdateien)
\De.Test.Public (das eigentliche Web Root)
\De.Test.Private (für private Daten)
\Net.MyWeb
Das selbe in grün…
Nun möchte ich per Script alle Dateien kopieren (Temp), diese per 7zip komprimieren (verschlüsselt) und danach an einen FTP Server hochladen.
Das funktioniert auch alles. Aber ich würde es gerne in so weit optimieren dass ich nicht jedes Mal die Batch Datei ändern muss wenn ein weiteres Verzeichnis im \IIS Root hinzu kommt. Also irgendwas For Next ähnliches. Vorzugsweise ohne PowerShell (keine Ahnung warum, ich mag die nicht).
Der Datenbank Teil in dem Script ist noch komplette Baustelle (wird auch noch nicht aufgerufen). Früher habe ich da mit der OSQL.EXE gearbeitet, funktionierte auch, aber in der neuen Version von MSSQL gibt es die ja nicht mehr. Aber auch hier für jede Datenbank ein eigener Eintrag in der Batch. Schöner wäre auch hier mit einem Befehl alle zu sichern. Oder alternativ gleiche DB Namen wie der Ordner zu erzwingen und den nehmen. Wie, egal.
Ich schreib mal das was ich bereits habe hier rein. Domains und Passwörter sind natürlich verfälscht.
@ECHO Off
COLOR 4F
CLS
REM ===== Konfiguration =====
SET IISRoot=C:\IIS Root
SET BackupRoot=%IISRoot%\Backup
SET TempDir=C:\Windows\Temp
SET ZipPass=blubberdiblubb
SET FtpServer=server.hoster.de
SET FtpUser=benutzer
SET FtpPass=passwort
SETLOCAL EnableDelayedExpansion
REM ===== Get timestamp for backup =====
FOR /f "skip=1 tokens=1-6 delims= " %%a in ('wmic path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') do (
IF NOT "%%~f"=="" (
SET /a Timestamp=10000 * %%f + 100 * %%d + %%a
SET Timestamp=!Timestamp:~-8,4!!Timestamp:~-4,2!!Timestamp:~-2,2!
)
)
REM ===== Creating of backups =====
CALL :PrintHeader \De.Seite1
SET bakFILE=%Timestamp%_De.Seite1
CALL :FileCopy De.Seite1
CALL :PrintHeader \Fallback
SET bakFILE=%Timestamp%_Fallback
CALL :FileCopy Fallback
CALL :PrintHeader \Net.Seite2
SET bakFILE=%Timestamp%_Net.Seite2
CALL :FileCopy Net.Seite2
GOTO Exit
REM ===== Error and exit handler =====
:PrintHeader
ECHO.
ECHO.
ECHO ================================================================================
ECHO Sichere %1
ECHO.
ECHO ================================================================================
ECHO.
GOTO :EOF
:Error
ECHO.
ECHO.
ECHO ================================================================================
ECHO Backup Prozess FEHLGESCHLAGEN!
ECHO.
ECHO ================================================================================
ECHO.
IF EXIST Log.txt TYPE Log.txt
GOTO :Exit2
:Exit
ECHO.
ECHO.
ECHO ================================================================================
ECHO Backup Prozess erfolgreich abgeschlossen!
ECHO.
ECHO ================================================================================
ECHO.
IF EXIST Log.txt DEL Log.txt
CALL :Cleanup
PING 127.0.0.1 > NUL
GOTO :Finish
:Exit2
CALL :Cleanup
GOTO :Finish
REM ===== Subroutines =====
:DBCopy
ECHO Erstelle Datenbank Backup...
ECHO Creating backup of database %1... >> Log.txt
ECHO. >> Log.txt
"C:\Program Files (x86)\Microsoft SQL Server\90\Tools\Binn\OSQL.EXE" -S ".\SQLExpress" -E -Q "BACKUP DATABASE %1 TO DISK='%bakROOT%\Backup\%1.mtf' WITH FORMAT" >> Log.txt
IF NOT ERRORLEVEL 0 GOTO :Error
GOTO :EOF
:FileCopy
ECHO Kopiere Dateien...
ECHO Copying %1... >> Log.txt
IF EXIST "%TempDir%\%1" RD /S /Q "%TempDir%\%1" > NUL
IF NOT ERRORLEVEL 0 GOTO :Error
MD "%TempDir%\%1" >> Log.txt
IF NOT ERRORLEVEL 0 GOTO :Error
IF EXIST "%1.lst" XCOPY /EXCLUDE:%1.lst /E /V /C /I /H /R /Y "%IISRoot%\%1\*.*" "%TempDir%\%1\*.*" >> Log.txt
IF NOT EXIST "%1.lst" XCOPY /E /V /C /I /H /R /Y "%IISRoot%\%1\*.*" "%TempDir%\%1\*.*" >> Log.txt
IF NOT ERRORLEVEL 0 GOTO :Error
ECHO Komprimiere Backup...
ECHO Compressing Backup... >> Log.txt
IF EXIST "%BackupRoot%\%bakFILE%.7z" DEL "%BackupRoot%\%bakFILE%.7z" > NUL
IF NOT ERRORLEVEL 0 GOTO :Error
7za a -mx=7 -mhe -p%ZipPass% -r "%BackupRoot%\%bakFile%.7z" "%TempDir%\%1" >> Log.txt
IF NOT ERRORLEVEL 0 GOTO :Error
IF EXIST "%TempDir%\%1" RD /S /Q "%TempDir%\%1" > NUL
IF NOT ERRORLEVEL 0 GOTO :Error
ECHO Kopiere Backup auf Backupserver...
ECHO Uploading file to Backup Server... >> Log.txt
PFTP s=%FtpServer% u=%FtpUser% p=%FtpPass% lf="%BackupRoot%\%bakFile%.7z" rf="/Backup/%bakFile%.7z" >> Log.txt
IF NOT ERRORLEVEL 0 GOTO Error
GOTO :EOF
:Cleanup
ECHO Lösche Systemvariablen...
SET 7zPass=
SET FtpServer=
SET FtpUser=
SET FtpPass=
REM ===== End of file =====
:Finish
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 304697
Url: https://administrator.de/forum/backup-script-optimierung-und-mssql-304697.html
Ausgedruckt am: 10.05.2025 um 08:05 Uhr
4 Kommentare
Neuester Kommentar
Hi,
du kannst robocopy statt xcopy nehmen. Bietet mehr Funktionen.
Wieso nicht einfach alle Ordner im Root-Ordner sichern, dann hast du alle dabei. Das müsste doch auch schon bei xcopy mit wildcard gehen.
Hast du schon nach einem fertigen, komplett-SQL-Backup-Skript gesucht? würde mich wundern, wenn es da nicht schon was gibt.
mit konkreteren Fragen "Alternative zu OSQL.EXE?" wirst du auch schneller konkreter Antworten bekommen.

sg Dirm
du kannst robocopy statt xcopy nehmen. Bietet mehr Funktionen.
Wieso nicht einfach alle Ordner im Root-Ordner sichern, dann hast du alle dabei. Das müsste doch auch schon bei xcopy mit wildcard gehen.
Hast du schon nach einem fertigen, komplett-SQL-Backup-Skript gesucht? würde mich wundern, wenn es da nicht schon was gibt.
mit konkreteren Fragen "Alternative zu OSQL.EXE?" wirst du auch schneller konkreter Antworten bekommen.
Vorzugsweise ohne PowerShell (keine Ahnung warum, ich mag die nicht)
vll magst du sie ja eh, wenn du gar nicht weißt wieso nicht sg Dirm