Ich versuche, SQL auf einem Verbindungsserver auszuführen, erhalte jedoch die folgenden Fehler:
BEGIN DISTRIBUTED TRANSACTION
SELECT TOP 1 * FROM Sessions
OLE DB provider "SQLNCLI" for linked server "ASILIVE" returned message "No transaction is active.".
Msg 7391, Level 16, State 2, Line 3
The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "ASILIVE" was unable to begin a distributed transaction.
Der Anbieter gibt zwei Fehler zurück:
Fehler Nr. 1:
Number: $80040E14
Source: Microsoft OLE DB Provider for SQL Server
Description: OLE DB provider "SQLNCLI" for linked server "ASILIVE" returned message "No transaction is active.".
HelpFile:
HelpContext: $00000000
SQLState: 01000
NativeError: 7412
Fehler Nr. 2
Number: $80040E14
Source: Microsoft OLE DB Provider for SQL Server
Description: The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "ASILIVE" was unable to begin a distributed transaction.
HelpFile:
HelpContext: $00000000
SQLState: 42000
NativeError: 7391
Wie kann ich Microsoft dazu bringen, Funktionalität gegenüber Sicherheit zu bevorzugen?
Oder zumindest, wie kann ich zwei SQL Server dazu bringen, miteinander zu sprechen?
Verwandte Fragen
- Der Vorgang konnte nicht ausgeführt werden, da der OLE DB-Anbieter "SQLNCLI10" ... (* Name des Verbindungsservers lautet
(null)
) - Verteilter Transaktionsfehler? ( mit Oracle-Anbieter )
- An einer verteilten Transaktion mit NHibernate kann nicht teilnehmen ( mithilfe von Hibernate ).
- Fehler beim Verwenden der verteilten Transaktion in SQL Server 2008 R2 ( SQL Server 2008 R2, keine Antwort )
- Verteilter Transaktionsfehler nur über Code ( verursacht durch Verbindungspooling )
- Fehler beim Ausführen des verteilten Transaktionskoordinators auf dem Verbindungsserver ( SQL Server 2008, keine Antwort )
- Verteilter Transaktionsfehler? ( keine akzeptierte Antwort; nur Antwort hilft nicht )
- Wie kann ich mit einem Verbindungsserver ohne Transaktion in eine entfernte Tabelle einfügen? ( akzeptierte Antwort löst sich nicht auf )
Was ich habe getan , ist irrelevant, aber ich werde es trotzdem posten.
Stellen Sie sicher, dass der
Distributed Transaction Coordinator
Dienst auf beiden Maschinen ausgeführt wird:Deaktivieren Sie die gesamte MSDTC-Sicherheit auf beiden Computern:
Aktivieren Sie zufällige Optionen auf dem Verbindungsserver:
Verflucht und fluchte.
Zerschlagene Sachen.
Überprüft, ob a
SELECT
den Verbindungsserver verwenden kann :SELECT * FROM ASILive.CustomerManagementSystem.dbo.Users .... (763 row(s) affected)
Überprüft, ob der Client-Server
ping
den Remote-Server kann :C:\Documents and Settings\avatar>ping asicmstest.contoso.com Pinging asicmstest.contoso.com [10.0.0.40] with 32 bytes of data: Reply from 10.0.0.40: bytes=32 time<1ms TTL=128 Reply from 10.0.0.40: bytes=32 time<1ms TTL=128 Reply from 10.0.0.40: bytes=32 time<1ms TTL=128 Reply from 10.0.0.40: bytes=32 time<1ms TTL=128 Ping statistics for 10.0.0.40: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 0ms, Maximum = 0ms, Average = 0ms
Überprüft, ob der Remote-Server namentlich zum initiierenden Server zurückkehren kann:
C:\Documents and Settings\avatar>ping asitestserver.contoso.com Pinging asitestserver.contoso.com [10.0.0.22] with 32 bytes of data: Reply from 10.0.0.22: bytes=32 time<1ms TTL=128 Reply from 10.0.0.22: bytes=32 time<1ms TTL=128 Reply from 10.0.0.22: bytes=32 time<1ms TTL=128 Reply from 10.0.0.22: bytes=32 time<1ms TTL=128 Ping statistics for 10.0.0.22: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 0ms, Maximum = 0ms, Average = 0ms
Überprüft, ob
@@SERVERNAME
der Servername auf beiden Servern übereinstimmt :SELECT @@SERVERNAME, SERVERPROPERTY('MachineName') ------------- ------------- ASITESTSERVER ASITESTSERVER
und
SELECT @@SERVERNAME, SERVERPROPERTY('MachineName') ---------- ---------- ASIGROBTEST ASIGROBTEST
Schrie
Ausgestellt
SET XACT_ABORT ON
vor meiner Anfrage Ausgabe :SET XACT_ABORT ON GO BEGIN DISTRIBUTED TRANSACTION SELECT TOP 1 * FROM Sessions
Zugegeben
Everyone
Full Control
an :HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer
auf beiden Servern.
Antworten:
Gefunden, MSDTC auf dem Remote-Server war ein Klon des lokalen Servers.
Aus dem Windows-Anwendungsereignisprotokoll:
Laufen
Das anschließende Stoppen und Neustarten des SQL Server-Dienstes hat das Problem behoben.
quelle
Ich konnte dieses Problem beheben (wie in den Kommentaren erwähnt), indem ich "Promotion of Distributed Transactions for RPC aktivieren" deaktivierte (dh auf "gesetzt"
False
):quelle
OK, also werden Dienste gestartet, es gibt einen Ethernet-Pfad zwischen ihnen, die Namensauflösung funktioniert, Verbindungsserver funktionieren und Sie haben die Transaktionsauthentifizierung deaktiviert.
Mein Bauch sagt Firewall-Problem, aber ein paar Dinge fallen mir ein ...
quelle
Wenn die Server geclustert sind und ein Cluster-DTC vorhanden ist, müssen Sie die Sicherheit für den Cluster-DTC deaktivieren, nicht für den lokalen DTC.
quelle
Wenn sich Ihr Zielserver in einer anderen Cloud oder einem anderen Rechenzentrum befindet, müssen Sie den Hosteintrag des MSDTC-Dienstes (Zielserver) auf Ihrem Quellserver hinzufügen .
Versuchen Sie dies, wenn das Problem nicht behoben ist. Nachdem Sie die MSDTC-Einstellungen aktiviert haben.
quelle
Für mich bezieht es sich auf die Firewall-Einstellung. Gehen Sie zu Ihrer Firewall-Einstellung, lassen Sie den DTC-Dienst zu und es hat funktioniert.
quelle
Mein letztes Abenteuer mit MSDTC und dieser Fehler heute stellte sich als DNS-Problem heraus. Sie sind auf dem richtigen Weg und fragen, ob sich die Maschinen in derselben Domäne befinden, EBarr. Tolle Liste für diese Ausgabe übrigens!
Meine Situation: Ich brauchte einen Server in einer untergeordneten Domäne, um verteilte Transaktionen über eine Firewall gegen einen Server in der übergeordneten Domäne ausführen zu können. Ich habe im Laufe der Jahre ziemlich oft Verbindungsserver verwendet, daher hatte ich alle üblichen Einstellungen in SQL für einen Verbindungsserver und in MSDTC, die Ian oben so gut dokumentiert hat. Ich habe MSDTC mit einer Reihe von TCP-Ports (5000-5200) für beide Server eingerichtet und eine Firewall-Lücke zwischen den Boxen für die Ports 1433 und 5000-5200 eingerichtet. Das hätte funktionieren sollen. Der Verbindungsserver wurde in Ordnung getestet und ich konnte den Remote-SQL-Server über den Verbindungsserver gut abfragen, aber ich konnte ihn nicht dazu bringen, eine verteilte Transaktion zuzulassen. Ich konnte sogar eine Verbindung auf dem QA-Server vom DEV-Server aus sehen, aber etwas machte die Rückreise nicht möglich.
Ich könnte den DEV-Server von der Qualitätssicherung aus mit einem FQDN wie PING DEVSQL.dev.domain.com pingen
Ich konnte den DEV-Server nicht nur mit dem Computernamen PINGEN: PING DEVSQL
Der DEVSQL-Server sollte Mitglied beider Domänen sein, aber der Name wurde im DNS der übergeordneten Domäne nicht aufgelöst. Mit dem Computerkonto für DEVSQL in der übergeordneten Domäne war etwas passiert. Nachdem wir DEVSQL zum DNS für die übergeordnete Domäne hinzugefügt hatten und "PING DEVSQL" vom Remote-QS-Server aus funktionierte, wurde dieses Problem für uns behoben.
Ich hoffe das hilft!
quelle
Abgesehen von den Sicherheitseinstellungen musste ich einige Ports auf beiden Servern öffnen, damit die Transaktion ausgeführt werden konnte. Ich musste Port 59640 öffnen, aber gemäß dem folgenden Vorschlag muss Port 135 geöffnet sein. http://support.microsoft.com/kb/839279
quelle
Ich habe den gleichen Fehler erhalten und es geschafft, ihn zu beheben, indem ich den MSDTC auf dem Quellserver richtig konfiguriert habe, um ausgehende und den DTC durch die Windows-Firewall zuzulassen.
Erlauben Sie dem Distributed Transaction Coordinator, der Tick Domain, den privaten und öffentlichen Optionen
quelle