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.
Log der 1. Sicherung --> sqlcmd -e -s \S1\Instanz1 -i C:\sql_save\%Instanz1%\%DB1%.sql -o %Sicherungspfad1%%DB1%.txt
Übergabedatei der 1. Sicherung
Log der 2. Sicherung --> sqlcmd -e -s \S2\Instanz2 -i C:\sql_save\%Instanz2%\%DB9%.sql -o %Sicherungspfad2%%DB9%.txt
Übergabedatei der 2. Sicherung
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;
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 117824
Url: https://administrator.de/forum/sqlcmd-benutzt-in-einer-batch-die-falsche-sql-instanz-117824.html
Ausgedruckt am: 22.12.2024 um 23:12 Uhr
4 Kommentare
Neuester Kommentar
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
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
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:
..änderst Du die Syntax in dem SQL auf:
...und übergibst die Variablen im SQLCmd.exe-Aufruf so:
Grüße
Biber
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