Posts mit dem Label Verbindungsserver werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Verbindungsserver werden angezeigt. Alle Posts anzeigen

Donnerstag, 30. Juni 2011

Microsoft SQL-Server Verbindungsserver einrichten

Mit folgendem, simplen SQL-Statement würde man Daten der Tabelle "Maschinen" aus der Datenbank "FlorianTestDB" von einem Server "Testserver2" auf einen anderen Server "Testserver1" in die gleichnamige Datenbank/Tabelle kopieren.

INSERT INTO [Testserver1].[FlorianTestDB].[dbo].[Maschinen]
SELECT * FROM [Testserver2].[FlorianTestDB].[dbo].[Maschinen]
GO

Voraussetzung für eine erfolgreiche Übertragung ist, dass der Zielserver als sogenannter Verbindungsserver auf dem Quellserver eingerichtet ist. Ist dieses nicht der Fall, so kommt folgende Meldung.

Meldung 7202, Ebene 11, Status 2, Zeile 1
Server 'Testserver1' konnte in 'sys.servers' nicht gefunden werden. Stellen Sie sicher, dass der richtige Servername angegeben wurde. Führen Sie ggf. die gespeicherte Prozedur 'sp_addlinkedserver' aus, um den Server in 'sys.servers' hinzuzufügen.

Abhilfe schafft man, indem man den Verbindungsserver auf einfache Art und Weise  anlegt. Hierzu muss man eine Verbindung mit dem Quellserver herstellen und folgenden Befehl ausführen, um den Zielserver als Verbindungsserver einzurichten.

EXEC sp_addlinkedserver 'Testserver1'
GO

Als Ergebnis sollte folgendes zurückkommen.

Befehl(e) wurde(n) erfolgreich abgeschlossen.

Führt man das SQL-Statement zum Kopieren der Daten nun erneut aus, so sollte es erfolgreich ausgeführt werden.

Eine kleine Einschränkung hierbei gibt es jedoch. Fügt man den Verbindungsserver wie oben beschrieben hinzu, so ist es notwendig, dass auf beiden Servern der aktuell verwendete Benutzer identisch eingerichtet ist.

Möchte man dieses nicht, benutzt unterschiedliche Passwörter oder verschiedene Benutzer, so ist es am einfachsten den Verbindungsserver über das SQL-Server-Management-Studio anzulegen.

Diese Vorgehensweise geht für die SQL-Server-Versionen 2000, 2005 und 2008

Donnerstag, 17. Dezember 2009

"Timeout abgelaufen" bei Abfrage des Verbindungsservers

Kürzlich hatte ich das Problem, dass alle meine Abfragen gegen einen Verbindungsserver auf ein Timeout liefen. Es hat sich hierbei um einen Datenabgleich zwischen zwei Datenbanken auf unterschiedlichen Servern gehandelt. Den einen Server (S2) habe ich zuvor als Verbindungsserver auf dem anderen (S1) eingerichtet. Danach habe ich auf dem Server S1 folgendes SQL-Statement ausgeführt.

Statement:
INSERT INTO dbo.NeueTabelle
SELECT * FROM [Server2].[DatenbankAlt].[dbo].AlteTabelle
WHERE ID NOT IN (SELECT ID FROM dbo.NeueTabelle)
AND Imei IN (SELECT Imei FROM dbo.VertragsTabelle)
AND Erstellungsdatum > '29.11.2009 00:00:00'

Datenmengen:
Quelltabelle (AlteTabelle) = 60 Mio.
Zieltabelle (NeueTabelle) = 55 Mio.

Nach kurzer Zeit des Wartens wurde mir dann folgende Fehlermeldung ausgeworfen:
Der OLE DB-Anbieter 'SQLNCLI10' für den Verbindungsserver 'Server2' hat die Meldung 'Abfragetimeout abgelaufen' zurückgeben.
Meldung 7399, Ebene 16, Status 1, Zeile 4
Der OLE DB-Anbieter 'SQLNCLI10' für den Verbindungsserver 'Server2' hat einen Fehler gemeldet. Die Ausführung wurde vom Anbieter beendet, da ein Ressourcenlimit erreicht wurde.
Meldung 7421, Ebene 16, Status 2, Zeile 4
Das Rowset kann nicht vom OLE DB-Anbieter 'SQLNCLI10' für den Verbindungsserver 'Server2' abgerufen werden.

Abhilfe:
Da bei mir sichergestellt ist, dass das Statement nur einmalig läuft und nach Beendigung das Timeout wieder gesetzt werden kann, habe ich dieses kurzfirstig wie folgt deaktiviert bzw. auf unbegrenzt gesetzt.

Remote Login Timeout mithilfe dieses Codes auf 30 Sekunden festlegen:
sp_configure 'remote login timeout', 30
go
reconfigure with override
go

Remote Query Timeout auf 0 (unbegrenztes Warten) mithilfe dieser Code festgelegt wird:
sp_configure 'remote query timeout', 0
go
reconfigure with override
go