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

Keine Kommentare:

Kommentar veröffentlichen