Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst SQL Server Backup Batch - Formatierungsproblem

Mitglied: Kollisionskurs

Kollisionskurs (Level 1) - Jetzt verbinden

25.01.2011 um 12:28 Uhr, 3893 Aufrufe, 6 Kommentare

Salve Ihr Batch'ler,

ich habe gerade angefangen eine kleine Batch-Datei zu schreiben, welche ein Datenbank-Backup auf einem SQL Server Express durchführen soll.

Mein Problem:

Die zu sichernden DB's werden flexibel in der Variablen %sqlBackupDBs% definiert - also im unteren Beispiel sollen die Datenbanken "meine db 1;meine db 2;meine db 3;meine db 4" gesichert werden.
Dazu schreibe ich mir hilfsweisse die Einträge temporär in eine Textdatei, um diese dann in der Zeile:

for /f "tokens=1,* delims=;" %%i in (%~DP0\sqlBackupDBs.txt) do set "Line=%%j" & call:backDB %%i !line:;= ! & goto :eof

wieder einzulesen und die Einträge zu trennen. Danach wird die "Batch-Schleife" abgearbeitet bzw. die Datenbank gesichert (meine db 1). Anschliessen kommt der zweite Eintrag dran bzw. die DB "meine db 2" kommt unters Messer usw.

Leider trennt mein delims=; die Einträge falsch bzw. schneidet die Einträge nach dem Leerzeichen ab...somit wird anstatt "meine db 1" lediglich "meine" übergeben.
Steh diesbezüglich irgendwie auf dem Schlauch und hoffe auf eure Hilfe...

der Vollständigkeit halbe habe ich meinen vollständigen Code gepostet bzw. mit Sicherheit "fällt" dem einen oder anderen noch eine verbesserungswürdige Zeile ein

Wenn ich die Geschichte fertig habe...werde ich diese natürlich posten - eventuell für den ein oder anderen interessant....weil damit Sicherungen ab SQL Server 2005 Express möglich sind.

01.
@echo off & setlocal enableDelayedExpansion  
02.
CLS 
03.
color F0 
04.
 
05.
Set "sqlCMDexe="C:\Program Files\Microsoft SQL Server\90\Tools\Binn\SQLCMD.EXE"" 
06.
Set "sqlServer=.\Instance" 
07.
<b>Set "sqlBackupDBs=meine db 1;meine db 2;meine db 3;meine db 4"</b> 
08.
Set "sqlIntSec=false" 
09.
Set "sqlCredUser=sa" 
10.
Set "sqlCredPass=sapassword" 
11.
Set "sqlBackupFolder=D:\backfolder\" 
12.
 
13.
if not exist %sqlCMDexe% goto noSQLCMDexe 
14.
 
15.
:formatDateTime 
16.
for /f "tokens=1-4 delims=. " %%i in ("%date%") do ( 
17.
  Set day=%%i 
18.
  Set month=%%j 
19.
  Set year=%%k 
20.
21.
 
22.
if not %errorlevel%==0 goto bakError 
23.
 
24.
echo %sqlBackupDBs% > %~DP0\sqlBackupDBs.txt 
25.
 
26.
<b>for /f "tokens=1,* delims=;" %%i in (%~DP0\sqlBackupDBs.txt) do set "Line=%%j" & call:backDB %%i !line:;= ! & goto :eof</b> 
27.
 
28.
:backDB 
29.
Set sqlBackupDB=%1 
30.
@echo "#...start Backup @ SQL-Server:%sqlServer% | Database:%sqlBackupDB%"  
31.
 
32.
If "%sqlIntSec%" == "false" (	 
33.
	Set "sqlLogin=-U %sqlCredUser% -P %sqlCredPass%" 
34.
35.
If "%sqlIntSec%" == "true" (	 
36.
	Set "sqlLogin=-E" 
37.
38.
 
39.
Set "sqlScriptFile=%~DP0%sqlBackupDB%_%day%%month%%year%.bak.sql" 
40.
 
41.
@echo "#...SQL Server Login: %sqlLogin%" 
42.
@echo "#...SQL Script Syntax: BACKUP DATABASE [%sqlBackupDB%] TO DISK='%sqlBackupFolder%%sqlBackupDB%.bak' WITH INIT, NAME = N'%sqlBackupDB%_%day%%month%%year%'"  
43.
@echo "#...SQL Script File: %sqlScriptFile%" 
44.
echo BACKUP DATABASE [%sqlBackupDB%] TO DISK='%sqlBackupFolder%%sqlBackupDB%.bak' WITH INIT, NAME = N'%sqlBackupDB%_%day%%month%%year%' > %sqlScriptFile% 
45.
 
46.
@echo "#...start /wait "%sqlCMDexe% -S %sqlServer% %sqlLogin% -i %sqlScriptFile% -o %sqlScriptFile%.log" 
47.
:: Aufruf der sqlCMDexe 
48.
 
49.
 
50.
If [%2]==[] goto :backNoError 
51.
Shift & goto :backDB  
52.
 
53.
:noSQLCMDexe 
54.
echo "#...%sqlCMDexe% not found/exist - EXIT!" 
55.
pause 
56.
::exit 
57.
 
58.
:backNoError 
59.
echo "#...Backup - Success...EXIT! (Errorlevel: %errorlevel%)" 
60.
msg * "#...Backup - Success...EXIT! (Errorlevel: %errorlevel%)" 
61.
pause 
62.
exit 
63.
 
64.
:bakError 
65.
echo "#...Backup - No Success...EXIT! (Errorlevel: %errorlevel%)" 
66.
msg * "#...Backup - No Success...EXIT! (Errorlevel: %errorlevel%)" 
67.
pause 
68.
exit
Danke & Grüße

Kollisionskurs
Mitglied: 32067
25.01.2011 um 12:51 Uhr
Hallo,

nur zur Info: Wir haben hier für unsere Express-Instanzen http://expressmaint.codeplex.com/ im Einsatz, der räumt auch automatisch alte Backups weg, wenn man nur 3 Stände oder so auf Platte haben will etc.pp.
Bitte warten ..
Mitglied: pieh-ejdsch
25.01.2011 um 14:30 Uhr
moin Kollisionskurs,
Leider trennt mein delims=; die Einträge falsch
das funktioniert schon richtig.

das Problem liegt in der Parameterübergabe vom Call was so aufgelöst wird:
CALL :Sprungmarke Parmeter1LeerzeichenParameter2LeerzeichenParameter3
um einen Parameter mit Sonderzeichen zu übergeben musst Du Anführungszeichen drumrumbauen.
diese Anführungszeichen blendest Du aus wenn Du in der Sub: %~1 verwendest.

Gruß Phil
Bitte warten ..
Mitglied: Kollisionskurs
01.02.2011 um 08:28 Uhr
moin Phil,

sorry der späten Antwort wegen...Dein Vorschlag mit den Anführungszeichen funktioniert...allerdings nur bei der ersten Parameterübergabe. Irgendwie steh ich diesbezüglich gerade auf dem Schlauch bzw. seh die Lösung nicht.

01.
 
02.
Set "sqlBackupDBs=meine DB1;meine DB2" 
03.
 
04.
echo %sqlBackupDBs% > %~DP0\sqlBackupDBs.txt 
05.
 
06.
for /f "tokens=1,* delims=," %%i in (%~DP0\sqlBackupDBs.txt) do set "Line=%%j" & call:backDB "%%i" !line:;= ! & goto :eof 
07.
 
08.
:backDB 
09.
Set sqlBackupDB=%~1 
10.
... 
11.
...
als Ausgabe erhalte ich:

"meine DB1" und "meine"

noch irgend einen Tipp.....

Danke im Voraus!

Grüße Kollisionskurs
Bitte warten ..
Mitglied: Biber
01.02.2011 um 09:06 Uhr
Moin Kollisionskurs,

wenn du doch deine Textdatei mit einer FOR /-Anweisung mit der Direktive "tokens=1,*" durchflöhst, dann bekommst du natürlich kein zweites Token namens %%j
Ersetze das durch %%i.
Demo am CMD-Prompt: führendes ">" ist mein Prompt; nicht mit eingeben
01.
>for /f "tokens=1,* delims=," %i in ("Meine DB1;meine Db2") do set "Line=%i" & @echo call:backDB "%i" !line:;= ! 
02.
>set "Line=Meine DB1;meine Db2"   & 
03.
call:backDB "Meine DB1;meineDb2" Meine DB1 meine Db2
Grüße
Biber
Bitte warten ..
Mitglied: pieh-ejdsch
01.02.2011 um 09:15 Uhr
moin Kollisionskurs,

lass enabledelayedexpansion weg.
die Temporäre Datei sqlBackupDBs.txt lässt Du komplett weg.
anstatt der langen Forschleife mit dem call ... & goto :eof machst Du diese Zeile daraus:
01.
 call :backDB "%sqlBackupDBs:;=" "%" & goto :eof
anstatt der Zeile 50.:If [%2]==[] goto :backNoError
01.
 if "%~2" == "" goto :backNoError
in der Variable Line enfernst Du alle Semikola, aber gibst Trozdem die Variable als einzelne Parameter rüber und selbst mit der Parameterkennzeichnung mit Umschliessenden Anführungszeichen hättest Du als Zweiten Paramter den Rest der Zeile.

Gruß Phil
Bitte warten ..
Mitglied: Kollisionskurs
02.02.2011 um 10:35 Uhr
moinsen zusammen,

vielen Dank für Euren Support bzw. trinkt auf mich ein virtuelles Bier. Mein Script läuft ....wahrscheinlich gibt es noch Verbesserungspotential etc. - aber es erfüllt seinen Zweck.
Und das die zu sichernden Datenbanken dynamisch angegeben werden können, ist mehr als geschmeidig.

Grüße

Kollisionskurs

01.
@echo off 
02.
CLS 
03.
 
04.
echo          ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» 
05.
echo          º  SQL Backup Script	 (C) 2011 XYZ GmbH  	       	       º 
06.
echo          ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ 
07.
 
08.
@echo.           
09.
@echo. 
10.
color F0 
11.
 
12.
::::::::::::::::::::SQLCMD.EXE @ xxx Embedded XP (SQL Server 2005) :::::::::::::::::::::::::::: 
13.
::Set "sqlCMDexePath=C:\Program Files\Microsoft SQL Server\90\Tools\Binn" 
14.
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
15.
 
16.
::::::::::::::::::::SQLCMD.EXE @ xxx Embedded 7 (SQL Server 2008):::::::::::::::::::::::::::::: 
17.
Set "sqlCMDexePath=C:\Program Files\Microsoft SQL Server\100\Tools\Binn" 
18.
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
19.
 
20.
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
21.
Set "sqlCMDexe=SQLCMD.exe" 
22.
:: SQL Server: Hostname[\Instancename] 
23.
Set "sqlServer=.\SQLEXPRESS"  
24.
:: Backup Database separated with = ";"  !!  
25.
Set "sqlBackupDBs=DB1;DB2" 
26.
:: SQL Login: Integrated Security - true/false 
27.
Set "sqlIntSec=false" 
28.
:: SQL Login: SQL User-Name (!!sqlIntSec=false!!) 
29.
Set "sqlCredUser=sa" 
30.
:: SQL Login: SQL User-Password (!!sqlIntSec=false!!) 
31.
Set "sqlCredPass=admin" 
32.
:: Backup Path: all Files (*.bak, *.sql, *.log)  - local or UNC Path 
33.
Set "sqlBackPath=\\share\dbback" 
34.
 
35.
:: execute net use command / map a network share - true/false 
36.
Set "netUseExec=false" 
37.
:: net use User Credential/Password 
38.
Set "netUseCred=Domain\User" 
39.
Set "netUsePass=passwd" 
40.
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
41.
 
42.
if not exist "%sqlCMDexePath%\%sqlCMDexe%" goto :nosqlCMDexe 
43.
@echo "#...found %sqlCMDexe% @ "%sqlCMDexePath%" 
44.
 
45.
Set "actualDate=%date:~-10,2%-%date:~-7,2%-%date:~-4,4%" 
46.
 
47.
If "%netUseExec%" == "true" ( 
48.
	net use /del %sqlBackPath% 
49.
	@echo "#...net use %sqlBackPath% %netUsePass% /user:%netUseCred%" 
50.
	net use %sqlBackPath% %netUsePass% /user:%netUseCred% 
51.
	::net use %sqlBackPath% 
52.
	if not %errorlevel%==0 goto :backError 
53.
54.
 
55.
If "%sqlIntSec%" == "false" (	 
56.
	Set "sqlLogin=-U %sqlCredUser% -P %sqlCredPass%" 
57.
58.
If "%sqlIntSec%" == "true" (	 
59.
	Set "sqlLogin=-E" 
60.
61.
 
62.
if not %errorlevel%==0 goto ::backError 
63.
 
64.
:: für jeden Semikolon-getrennten Eintrag (bzw. für jede DB) in der Variablen %sqlBackupDBs% = Sprung in die Sub Routine. 
65.
:: Shift & goto :backDB "verschiebt" die Parameterliste nach links und initiiert erneut den Sprung in die Sub Routine. 
66.
call :backDB "%sqlBackupDBs:;=" "%" & goto :eof 
67.
 
68.
:backDB 
69.
Set sqlBackupDB=%~1 
70.
@echo "#...start Backup @ SQL-Server:%sqlServer% | Database:%sqlBackupDB%"  
71.
@echo. 
72.
 
73.
Set "sqlScriptFile=%sqlBackPath%\%sqlBackupDB%.bak.sql" 
74.
 
75.
@echo "#...SQL Server Login: %sqlLogin%" 
76.
@echo "#...SQL Script File: %sqlScriptFile%" 
77.
::@echo "#...SQL Script Syntax: BACKUP DATABASE [%sqlBackupDB%] TO DISK='%sqlBackPath%\%sqlBackupDB%_%actualDate%.bak' WITH INIT, NAME = N'%sqlBackupDB%_%actualDate%'"  
78.
:: wenn die jeweilige *.bak Datei überschrieben werden soll, bitte den Zusatz _%actualDate% entfernen = [TO DISK='%sqlBackPath%\%sqlBackupDB%.bak'] 
79.
@echo BACKUP DATABASE [%sqlBackupDB%] TO DISK='%sqlBackPath%\%sqlBackupDB%_%actualDate%.bak' WITH INIT, NAME = N'%sqlBackupDB%_%actualDate%' > "%sqlScriptFile%" 
80.
@echo "#...start /wait /MIN %sqlCMDexe% -S %sqlServer% %sqlLogin% -i "%sqlScriptFile%" -o "%sqlScriptFile%.log"" 
81.
@echo. 
82.
@echo "#...wait..." 
83.
 
84.
pushd "%sqlCMDexePath%" 
85.
start /wait /MIN %sqlCMDexe% -S %sqlServer% %sqlLogin% -i "%sqlScriptFile%" -o "%sqlScriptFile%_%actualDate%.log" 
86.
popd 
87.
 
88.
if not %errorlevel%==0 goto :backError 
89.
 
90.
echo          ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ 
91.
echo            Backup File -%sqlBackupDB%- successfully created!!	  	        
92.
echo          ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ 
93.
 
94.
@echo "#...Log-File: "%sqlScriptFile%.log"" 
95.
@echo. 
96.
 
97.
if "%~2" == "" goto :backNoError 
98.
Shift & goto :backDB  
99.
 
100.
:nosqlCMDexe 
101.
echo "#..."%sqlCMDexePath%\%sqlCMDexe%" not found - EXIT!" 
102.
pause 
103.
exit 
104.
 
105.
:backNoError 
106.
echo "#...Backup - Success...EXIT! (Errorlevel: %errorlevel%)" 
107.
::msg * "#...Backup - Success...EXIT! (Errorlevel: %errorlevel%)" 
108.
pause 
109.
exit 
110.
 
111.
:backError 
112.
echo "#...Backup - No Success...EXIT! (Errorlevel: %errorlevel%)" 
113.
::msg * "#...Backup - No Success...EXIT! (Errorlevel: %errorlevel%)" 
114.
pause 
115.
exit 
116.
 
Bitte warten ..
Ähnliche Inhalte
Datenbanken
SQL Server 2014 Differentielles Backup
Frage von ITSyndicationDatenbanken1 Kommentar

Hallo, ich versuche nun schon eine Weile das Differentielle Backup zum laufen zu bekommen. Sicherung Full: BACKUP DATABASE DATASET ...

Datenbanken
MS-SQL-Server + T-SQL+Batch
Frage von kallewirschDatenbanken4 Kommentare

Hallo Gemeinde, mal wieder ein Problem aus dem Bereich des MS-SQL-Servers. Folgendes Thema: Nachts sollen automatisch Backups der DBen ...

Netzwerkmanagement
Batch, Linux: Backup auf FTP Server
Frage von HerrAusragendNetzwerkmanagement3 Kommentare

Hallo, ich habe auf eine externe Festplatte (eigene Stromversorgung) an meinen Raspberry Pi angeschlossen und möchte darauf automatisierte Backups ...

Backup
FTP und SQL Backup vom Webserver
gelöst Frage von DPiegzaBackup4 Kommentare

Hallo zusammen, Ich habe einen Webshop bei 1&1 und möchte eine voll automatische Sicherung von den Dateien und der ...

Neue Wissensbeiträge
Windows 10

USB Maus und Tastatur versagen Dienst unter Windows 10

Erfahrungsbericht von hardykopff vor 17 StundenWindows 103 Kommentare

Da steht man ziemlich dumm da, wenn der PC sich wegen fehlender USB Tastatur und Maus nicht bedienen lässt. ...

Administrator.de Feedback
Update der Seite: Alles zentriert
Information von Frank vor 20 StundenAdministrator.de Feedback14 Kommentare

Hallo User, die größte Änderung von Release 5.8 ist das Zentrieren der Webseite (auf großen Bildschirmen) und ein "Welcome"-Teaser ...

Humor (lol)

WhatsApp-Nachrichten endlich auch per Bluetooth versendbar

Information von BassFishFox vor 1 TagHumor (lol)4 Kommentare

Genau darauf habe ich gewartet! ;-) Der beliebte Messaging-Dienst WhatsApp erhält eine praktische neue Funktion: Ab dem nächsten Update ...

Google Android

Googles "Android Enterprise Recommended" für Unternehmen

Information von kgborn vor 2 TagenGoogle Android3 Kommentare

Hier eine Information, die für Administratoren und Verantwortliche in Unternehmen, die für die Beschaffung und das Rollout von Android-Geräten ...

Heiß diskutierte Inhalte
Server Hardware
Welche Rolle spielt Design bei Enterprise IT Hardware?
Frage von ApolloXServer Hardware17 Kommentare

Ich arbeite für einen internationalen Elektronikhersteller in der Forschung und meine Aufgabe ist es, Feedback von Nutzern in Hinsicht ...

Windows Network
WSUS4 und Windows 10 Updates automatisch installieren
Frage von sammy65Windows Network15 Kommentare

Hallo miteinander, ich habe mit einen neuen WSUS Server aufgesetzt Server 2016 darauf einen aktuellen WSUS. Grund, wir stellen ...

Memory Cards
Vergessliche USB-Sticks?
Frage von hanheikMemory Cards14 Kommentare

Ich habe in den letzten Tagen 500 USB-Sticks mit Bilddateien bespielt. Obwohl ich die Dateien mit größter Sorgfalt kopiert ...

Hyper-V
Hyper-V mit altem XEON-Server. Was ist falsch?
Frage von LollipopHyper-V11 Kommentare

Hallo Bin etwas frustriert. Kleinbetrieb, ca. 15 PC's, 2 Stk. Server mit einigen virtuellen PC's für Fernwartung, VaultServer für ...