Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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

Frage Entwicklung Batch & Shell

Mitglied: Kollisionskurs

Kollisionskurs (Level 1) - Jetzt verbinden

25.01.2011 um 12:28 Uhr, 3791 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 ..
Neuester Wissensbeitrag
Microsoft

Lizenzwiederverkauf und seine Tücken

(5)

Erfahrungsbericht von DerWoWusste zum Thema Microsoft ...

Ähnliche Inhalte
Datenbanken
MS-SQL-Server + T-SQL+Batch (4)

Frage von kallewirsch zum Thema Datenbanken ...

Windows Server
gelöst SQL-Server Datenbanksicherung inkl. Benutzerberechtigungen dafür? (4)

Frage von 1410640014 zum Thema Windows Server ...

Windows 10
gelöst Installationsproblem sql server 2014 auf windos 10 rechner (23)

Frage von jensgebken zum Thema Windows 10 ...

Heiß diskutierte Inhalte
Windows Netzwerk
Windows 10 RDP geht nicht (16)

Frage von Fiasko zum Thema Windows Netzwerk ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Microsoft Office
Keine Updates für Office 2016 (13)

Frage von Motte990 zum Thema Microsoft Office ...