tommyb83
Goto Top

Backup Script Optimierung und MSSQL

Hiho face-smile

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

Content-Key: 304697

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

Ausgedruckt am: 28.03.2024 um 12:03 Uhr

Mitglied: TommyB83
TommyB83 17.05.2016 um 12:48:02 Uhr
Goto Top
Oops, die Pfade sind natürlich
\De.Seite
\De.Seite\Public
und nicht
\De.Seite.Public

Sorry. Ein Edit gibt es hier ja scheinbar nicht?!
Mitglied: Dirmhirn
Dirmhirn 17.05.2016 um 13:02:19 Uhr
Goto Top
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.

Vorzugsweise ohne PowerShell (keine Ahnung warum, ich mag die nicht)
vll magst du sie ja eh, wenn du gar nicht weißt wieso nicht face-smile

sg Dirm
Mitglied: TommyB83
TommyB83 17.05.2016 um 13:12:35 Uhr
Goto Top
Hi, schon mal Danke face-smile

RoboCopy… Naja ich bleibe wenn möglich lieber bei boardeigenen Mitteln. Geht mit XCopy ja auch. Das Problem mit Wildcards ist aber dass ich pro Web (Seite 1, Seite 2, …) einzelne 7z Archive haben möchte. Würde ich eine Wildcard Copy machen bräuchte ich wesentlich mehr freien Festplattenspeicher (durch die tempoäre Kopie und das Archiv) als wenn ich Ordner für Ordner durch gehe.

Wegen OSQL schau ich noch mal nach. Hatte bisher nur Lösungen damit gefunden.

PS… Da kann ich mir auch gleich ne VB.Net Anwendung schreiben. Ich seh da nicht so den Sinn drin. Aber jedem das Seine.
Mitglied: Dirmhirn
Dirmhirn 17.05.2016 um 13:56:19 Uhr
Goto Top
Ein code snippet, das dir vll hilft.
REM compress all sub-folders to single zip file
set zippath=c:\Program Files\7-Zip\7z.exe
for /d %%X in (*) do "%zippath%" a "%%X.zip" "%%X\"  

RoboCopy… Naja ich bleibe wenn möglich lieber bei boardeigenen Mitteln.
ist seit WinXP(?) an bord...