seelbreaker
Goto Top

SQLCMD benutzt in einer Batch die falsche SQL-Instanz

Es wird eine Batch ausgeführt die mittels SQLCMD mehrere Datenbanken verteilt auf 2 Server und 2 Instanzen Datenbanken sichern soll:
Server 1 --> Instanz1 --> Datenbanken 1-5
Server 2 --> Instanz2 --> Datenbanken 6-16

Danach läuft noch Defragmentierungstask los, der ist aber auskommentiert, da erstmal die SQL Sicherung laufen soll.

Die Batch wird von Server 1 ausgeführt mit als Domänenadmin.

Die von mir geposteten Batches etc. lassen sich unter Notepad++ besser lesen :P

Mein Problem ist nun, dass in der Batch die Datenbanken vom 1. Server und der 1. Instanz ordnungsgemäß gesichert werden.

Sobald der Task für Server2--> Instanz2--> DB 6-16 losläuft sucht der aber komischerweise auf dem 1. Server und der 1. Instanz...

Hier mal meine Batch.

Daraufhin folgt ein Log von der 1. Sicherung die erfolgreich durchläuft und die Übergabedatei für SQLCMD. Danach Log und Übergabedatei für SQLCMD der 2. Sicherung bei der mein Problem besteht.

@echo off

REM Umgebungsvariablen festlegen
REM Server
SET S1=LXSRV3
SET S2=LXSRV2
SET S3=LXDC1

REM Instanzen
SET Instanz1=Instanz01
SET Instanz2=w4a
SET Instanz3=
SET Instanz4=

REM Datenbanken
SET DB1=EHF_Test
SET DB2=eloam
SET DB3=blab
SET DB4=blub
SET DB5=blib
SET DB6=db_10it
SET DB7=db_zp_10it_banking
SET DB8=Northwind
SET DB9=pubs
SET DB10=Work
SET DB11=Workdef
SET DB13=WorkM001
SET DB14=WorkM002
SET DB15=WorkM003
SET DB16=WorkM004
SET DB17=
SET DB18=
SET DB19=
SET DB20=

REM Sicherungspfade (wo die Backups und Logs hinkommen)
SET Sicherungspfad1=E:\sql-test\%Instanz1%\
SET Sicherungspfad2=E:\sql-test\%Instanz2%\

REM Überprüfen auf das Vorhandensein für das Sicherungsverzeichnis für die Sicherung1
if exist %Sicherungspfad1% goto Sicherung1
mkdir %Sicherungspfad1%



REM Sicherung aller Datenbanken auf Server 1, Instanz1
:Sicherung1
sqlcmd -e -s \S1\Instanz1 -i C:\sql_save\%Instanz1%\%DB1%.sql -o %Sicherungspfad1%%DB1%.txt
REM sqlcmd -e -s \S1\Instanz1 -i C:\sql_save\%Instanz1%\%DB2%.sql -o %Sicherungspfad1%%DB2%.txt
REM sqlcmd -e -s \S1\Instanz1 -i C:\sql_save\%Instanz1%\%DB3%.sql -o %Sicherungspfad1%%DB3%.txt
REM sqlcmd -e -s \S1\Instanz1 -i C:\sql_save\%Instanz1%\%DB4%.sql -o %Sicherungspfad1%%DB4%.txt
REM sqlcmd -e -s \S1\Instanz1 -i C:\sql_save\%Instanz1%\%DB5%.sql -o %Sicherungspfad1%%DB5%.txt



REM Überprüfen auf das Vorhandensein für das Sicherungsverzeichnis für die Sicherung2
if exist %Sicherungspfad2% goto Sicherung2
mkdir %Sicherungspfad2%

REM Sicherung aller Datenbanken auf Server 2, Instanz 2
:Sicherung2
REM sqlcmd -e -s \S2\Instanz2 -i C:\sql_save\%Instanz2%\%DB6%.sql -o %Sicherungspfad2%%DB6%.txt
REM sqlcmd -e -s \S2\Instanz2 -i C:\sql_save\%Instanz2%\%DB7%.sql -o %Sicherungspfad2%%DB7%.txt
REM sqlcmd -e -s \S2\Instanz2 -i C:\sql_save\%Instanz2%\%DB8%.sql -o %Sicherungspfad2%%DB8%.txt
sqlcmd -e -s \S2\Instanz2 -i C:\sql_save\%Instanz2%\%DB9%.sql -o %Sicherungspfad2%%DB9%.txt
REM sqlcmd -e -s \S2\Instanz2 -i C:\sql_save\%Instanz2%\%DB10%.sql -o %Sicherungspfad2%%DB10%.txt
REM sqlcmd -e -s \S2\Instanz2 -i C:\sql_save\%Instanz2%\%DB11%.sql -o %Sicherungspfad2%%DB11%.txt
REM sqlcmd -e -s \S2\Instanz2 -i C:\sql_save\%Instanz2%\%DB12%.sql -o %Sicherungspfad2%%DB12%.txt
REM sqlcmd -e -s \S2\Instanz2 -i C:\sql_save\%Instanz2%\%DB13%.sql -o %Sicherungspfad2%%DB13%.txt
REM sqlcmd -e -s \S2\Instanz2 -i C:\sql_save\%Instanz2%\%DB14%.sql -o %Sicherungspfad2%%DB14%.txt
REM sqlcmd -e -s \S2\Instanz2 -i C:\sql_save\%Instanz2%\%DB15%.sql -o %Sicherungspfad2%%DB15%.txt
REM sqlcmd -e -s \S2\Instanz2 -i C:\sql_save\%Instanz2%\%DB16%.sql -o %Sicherungspfad2%%DB16%.txt





REM "C:\Programme\Auslogics\AusLogics Disk Defrag\cdefrag -c -log:"C:\Dokumente und Einstellungen\All Users\Desktop\Defragmentierung.html""  

pause


Log der 1. Sicherung --> sqlcmd -e -s \S1\Instanz1 -i C:\sql_save\%Instanz1%\%DB1%.sql -o %Sicherungspfad1%%DB1%.txt
-- Deklarieren der Variablen
declare @database as varchar(100);
declare @pfad as varchar(100);
declare @Instanz as varchar(100);

-- Name der zu sichernden Datenbank und Instanzen
set @database = N'EHF_Test';  
set @Instanz = N'Instanz01';  

-- Pfad zusammenbasteln
select @pfad = 'E:\sql-test\' + @Instanz + '\' + @database  + '_Sicherung.bak';  

-- Und jetzt das Backup
BACKUP DATABASE @database TO DISK = @pfad WITH FORMAT;
2936 Seiten wurden für die 'EHF_Test'-Datenbank, Datei 'EHF_Test_dat' für Datei 1, verarbeitet.  
1 Seiten wurden für die 'EHF_Test'-Datenbank, Datei 'EHF_Test_log' für Datei 1, verarbeitet.  
BACKUP DATABASE hat erfolgreich 2937 Seiten in 0.662 Sekunden verarbeitet (36.344 MB/s).

Übergabedatei der 1. Sicherung
-- Deklarieren der Variablen
declare @database as varchar(100);
declare @pfad as varchar(100);
declare @Instanz as varchar(100);

-- Name der zu sichernden Datenbank und Instanzen
set @database = N'EHF_Test';  
set @Instanz = N'Instanz01';  

-- Pfad zusammenbasteln
select @pfad = 'E:\sql-test\' + @Instanz + '\' + @database  + '_Sicherung.bak';  

-- Und jetzt das Backup
BACKUP DATABASE @database TO DISK = @pfad WITH FORMAT;


Log der 2. Sicherung --> sqlcmd -e -s \S2\Instanz2 -i C:\sql_save\%Instanz2%\%DB9%.sql -o %Sicherungspfad2%%DB9%.txt
-- Deklarieren der Variablen
declare @database as varchar(100);
declare @pfad as varchar(100);
declare @Instanz as varchar(100);

-- Name der zu sichernden Datenbank und Instanzen
set @database = N'pubs';  
set @Instanz = N'w4a';  

-- Pfad zusammenbasteln
select @pfad = 'E:\sql-test\' + @Instanz + '\' + @database  + '_Sicherung.bak';  

-- Und jetzt das Backup
BACKUP DATABASE @database TO DISK = @pfad WITH FORMAT;
Meldung '911', Ebene '16', Status '11', Server 'LXSRV3\INSTANZ01', Zeile 14  
'In 'sysdatabases' wurde kein Eintrag für die 'pubs'-Datenbank gefunden. Es wurde kein Eintrag mit diesem Namen gefunden. Stellen Sie sicher, dass der Name richtig eingegeben wurde.'  
Meldung '3013', Ebene '16', Status '1', Server 'LXSRV3\INSTANZ01', Zeile 14  
'BACKUP DATABASE wird fehlerbedingt beendet.'  

Übergabedatei der 2. Sicherung
-- Deklarieren der Variablen
declare @database as varchar(100);
declare @pfad as varchar(100);
declare @Instanz as varchar(100);

-- Name der zu sichernden Datenbank und Instanzen
set @database = N'pubs';  
set @Instanz = N'w4a';  

-- Pfad zusammenbasteln
select @pfad = 'E:\sql-test\' + @Instanz + '\' + @database  + '_Sicherung.bak';  

-- Und jetzt das Backup
BACKUP DATABASE @database TO DISK = @pfad WITH FORMAT;

Content-Key: 117824

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

Printed on: April 18, 2024 at 23:04 o'clock

Member: Biber
Biber Jun 09, 2009 at 15:23:30 (UTC)
Goto Top
Moin seelbreaker,

es ist beim Arbeiten mit M$-Tools oft ungemein hilfreich sich vorzustellen, wie wohl ein pickliger Redmonder Praktikant so ein Utilily wie SQLCMD zusammenschroten würde.

Dann kommt man/frau relativ schnell auf den Bolzen, dass sich ein Server-Wechsel via SQLCmd-Skript nur hinbekommen lässt, wenn Du zwischen den beiden Aufrufen ein explizites GO einfügst.


Frag nicht....

Grüße
Biber
Member: filippg
filippg Jun 09, 2009 at 17:24:59 (UTC)
Goto Top
Hallo,

Die Komandozeilenoptionen bei sqlcmd sind Case-Sensitiv. Ein "-s" wird daher ignoriert. Auf Server 1 funktioniert es dann, da das Skript dort ausgeführt und die Standardinstanz verwendet wird.

Gruß

Filipp
Member: Biber
Biber Jun 09, 2009 at 17:50:07 (UTC)
Goto Top
Moin filippg,

Na, dann versuche ich auch noch mal was Sinnvolles beizutragen

du kannst aber auch mit EINEM *.sql-Skript arbeiten und die Variablen direkt übergeben.
Dazu dieht der un- oder lau dokumentierte Parameter -v.


D.h statt diesem Geraffel:
....
set @database = N'pubs';   
set @Instanz = N'w4a';   
-- Pfad zusammenbasteln 
select @pfad = 'E:\sql-test\' + @Instanz + '\' + @database  + '_Sicherung.bak';   
BACKUP DATABASE @database TO DISK = @pfad WITH FORMAT;

..änderst Du die Syntax in dem SQL auf:

BACKUP DATABASE $(database) TO DISK = $(pfad) WITH FORMAT;

...und übergibst die Variablen im SQLCmd.exe-Aufruf so:
sqlcmd -e -S \S1\Instanz1 -i C:\sql_save\%Instanz1%\%DB1%.sql -v database-pubs pfad=E:\sql-test\Instanzxx -o %Sicherungspfad1%%DB1%.txt 

Grüße
Biber
Member: Seelbreaker
Seelbreaker Jun 10, 2009 at 07:50:14 (UTC)
Goto Top
Zitat von @filippg:
Hallo,

Die Komandozeilenoptionen bei sqlcmd sind Case-Sensitiv. Ein
"-s" wird daher ignoriert. Auf Server 1 funktioniert es
dann, da das Skript dort ausgeführt und die Standardinstanz
verwendet wird.

Gruß

Filipp


Oh man, das war es face-smile