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

Frage Entwicklung Batch & Shell

Mitglied: Kollisionskurs

Kollisionskurs (Level 1) - Jetzt verbinden

25.01.2011 um 12:28 Uhr, 3866 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
Batch & Shell

Open Object Rexx: Eine mittlerweile fast vergessene Skriptsprache aus dem Mainframebereich

Information von Penny.Cilin vor 1 TagBatch & Shell9 Kommentare

Ich kann mich noch sehr gut an diese Skriptsprache erinnern und nutze diese auch heute ab und an noch. ...

Humor (lol)

"gimme gimme gimme": Automatischer Test stolpert über Easter Egg im man-Tool

Information von Penny.Cilin vor 1 TagHumor (lol)6 Kommentare

Interessant, was man so alles als Easter Egg implementiert. Ist schon wieder Ostern? "gimme gimme gimme": Automatischer Test stolpert ...

MikroTik RouterOS

Mikrotik - Lets Encrypt Zertifikate mit MetaROUTER Instanz auf dem Router erzeugen

Anleitung von colinardo vor 1 TagMikroTik RouterOS8 Kommentare

Einleitung Folgende Anleitung ist aus der Lage heraus entstanden das ein Kunde auf seinem Mikrotik sein Hotspot Captive Portal ...

Sicherheit

Sicherheitslücke in HP-Druckern - Firmware-Updates stehen bereit

Information von BassFishFox vor 1 TagSicherheit1 Kommentar

Ein weiterer Grund, dass Drucker keinerlei Verbindung nach "auswaerts" haben sollen. Unter Verwendung spezieller Malware können Angreifer aus der ...

Heiß diskutierte Inhalte
Off Topic
Fachkräftemangel in Deutschland? - Talentschmiede schreibt alle 2 Tage die gleichen Stellen aus
Frage von Penny.CilinOff Topic12 Kommentare

Hallo, haben wir in Deutschland Fachkräftemangel? Die Talentschmiede schreibt gefühlt alle zwei Tage dieselben Stellen aus. Und das schon ...

Windows Server
Windows Store Apps
gelöst Frage von PeterleBWindows Server11 Kommentare

Gibt es einen Weg, auf Windows Server 2016 Windows Store Apps wie zum Beispiel die HP Smart App zu ...

Microsoft Office
Outlook Cache Mode Frage
Frage von GwaihirMicrosoft Office11 Kommentare

Hallo zusammen, bin gerade neu in der Firma und lerne hier einige neue Dinge kennen. Zum Beispiel, dass die ...

Microsoft
Erfahrungen mit Webcam over RDP gesucht
Frage von DerWoWussteMicrosoft10 Kommentare

Moin Kollegen. Bekanntlich kann man Webcams nur mit Drittanbietersoftware in RDP reinschleifen. Was nutzt Ihr dazu? Wie stabil funktioniert ...