Eine verteilte Transaktion kann nicht gestartet werden

95

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


Was ich habe getan , ist irrelevant, aber ich werde es trotzdem posten.

  1. Stellen Sie sicher, dass der Distributed Transaction CoordinatorDienst auf beiden Maschinen ausgeführt wird:

    Geben Sie hier die Bildbeschreibung ein

    Geben Sie hier die Bildbeschreibung ein

  2. Deaktivieren Sie die gesamte MSDTC-Sicherheit auf beiden Computern:

    Geben Sie hier die Bildbeschreibung ein

    Geben Sie hier die Bildbeschreibung ein

  3. Aktivieren Sie zufällige Optionen auf dem Verbindungsserver:

Geben Sie hier die Bildbeschreibung ein

  1. Verflucht und fluchte.

  2. Zerschlagene Sachen.

  3. Überprüft, ob a SELECTden Verbindungsserver verwenden kann :

        SELECT * FROM ASILive.CustomerManagementSystem.dbo.Users
        ....
    
        (763 row(s) affected)
  4. Überprüft, ob der Client-Server pingden 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
  5. Ü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
  6. Überprüft, ob @@SERVERNAMEder Servername auf beiden Servern übereinstimmt :

       SELECT @@SERVERNAME, SERVERPROPERTY('MachineName')
    
       -------------  -------------
       ASITESTSERVER  ASITESTSERVER

    und

       SELECT @@SERVERNAME, SERVERPROPERTY('MachineName')
    
       ----------  ----------
       ASIGROBTEST  ASIGROBTEST
  7. Schrie

  8. Ausgestellt SET XACT_ABORT ONvor meiner Anfrage Ausgabe :

    SET XACT_ABORT ON
    GO
    BEGIN DISTRIBUTED TRANSACTION
    SELECT TOP 1 * FROM Sessions
  9. Zugegeben Everyone Full Controlan :

    HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer

    auf beiden Servern.

Ian Boyd
quelle
30
Gut zu sehen, dass Sie den entscheidenden Schritt "verflucht und geschworen" nicht übersprungen haben!
JWL
11
@joelarson Hey, manchmal sind die Leute sehr speziell, dass Sie jedem Schritt folgen . Ich wollte nicht, dass jemand sagte, ich hätte nichts ausprobiert.
Ian Boyd
5
Ich liebe diesen Beitrag. Es ist typisch für jede Erfahrung, die ich jemals mit MSDTC gemacht habe.
A. Murray
5
In meinem Fall funktioniert es, nachdem ich "Promotion für verteilte Transaktionen für RPC aktivieren" auf dem Verbindungsserver auf "Falsch" gesetzt habe. Vielleicht versuchen Sie das
Sarsaparilla
3
@HaiPhan Das Deaktivieren der Verwendung verteilter Transaktionen beeinträchtigt die transnationale Integrität: Wenn Sie Ihre Änderungen auf dem lokalen Server zurücksetzen, bleiben die Änderungen auf dem Remote-Server erhalten. Sehr gefährlich.
Ian Boyd

Antworten:

31

Gefunden, MSDTC auf dem Remote-Server war ein Klon des lokalen Servers.

Aus dem Windows-Anwendungsereignisprotokoll:

Ereignistyp: Fehler
Ereignisquelle: MSDTC
Ereigniskategorie: CM
Ereignis-ID: 4101
Datum: 19.09.2011
Zeit: 13:32:59
Benutzer: N / A
Computer: ASITESTSERVER
Beschreibung:

Der lokale MS-DTC hat festgestellt, dass der MS-DTC in ASICMSTEST dieselbe eindeutige Identität wie der lokale MS-DTC hat. Dies bedeutet, dass die beiden MS DTC nicht miteinander kommunizieren können. Dieses Problem tritt normalerweise auf, wenn eines der Systeme mit nicht unterstützten Klonwerkzeugen geklont wurde. MS DTC erfordert, dass die Systeme mit unterstützten Klon-Tools wie SYSPREP geklont werden. Wenn Sie 'msdtc -uninstall' und dann 'msdtc -install' an der Eingabeaufforderung ausführen, wird das Problem behoben. Hinweis: Wenn Sie 'msdtc -uninstall' ausführen, verliert das System alle MS DTC-Konfigurationsinformationen.

Weitere Informationen finden Sie im Hilfe- und Supportcenter unter http://go.microsoft.com/fwlink/events.asp .

Laufen

msdtc -uninstall
msdtc -install

Das anschließende Stoppen und Neustarten des SQL Server-Dienstes hat das Problem behoben.

Ian Boyd
quelle
2
Mal sehen, ob ich es richtig verstanden habe: 1- msdtc -uninstall 2- msdtc -install 3- SQL Server-Dienst neu starten 4- SQL Agent-Dienst neu starten, nur um sicherzugehen 5- sogar den Dienst "Distributed Transaction Coordinator" neu starten ... Ich habe das alles auf beiden Rechnern (Hauptserver & Verbindungsserver) a ~ und nichts gemacht, immer noch der gleiche Fehler!
Hamid Sadeghian
9

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):

Geben Sie hier die Bildbeschreibung ein

Steve Bauman
quelle
1
Das hat bei mir funktioniert. Was seltsam ist, ist, dass es seit Wochen in Ordnung ist und dann plötzlich anfängt. Möglicherweise, weil der DTC-Dienst des Remote-Servers möglicherweise deaktiviert ist. Trotzdem danke.
Boyd P
6

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 ...

  1. Befinden sich die Maschinen in derselben Domäne? (Ja, sollte bei deaktivierter Authentifizierung keine Rolle spielen)
  2. Laufen Firewalls auf den Maschinen? DTC kann für Firewalls ein wenig schmerzhaft sein, da es eine Reihe von Ports verwendet (siehe http://support.microsoft.com/kb/306843). Ich würde Firewalls vorerst deaktivieren, um das Problem zu identifizieren
  3. Was sagt DTC-Ping? http://www.microsoft.com/download/en/details.aspx?id=2868
  4. Unter welchem ​​Konto wird der SQL-Dienst ausgeführt?
EBarr
quelle
2

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.

David Wolfinger
quelle
1

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.

JERRY
quelle
1

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.Geben Sie hier die Bildbeschreibung ein

Hoang Tran
quelle
0

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!

Marck
quelle
0

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

Trepach
quelle
0

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

Kaawach sagte
quelle