Wie aktiviere ich MSDTC unter SQL Server?

106

Ist das überhaupt eine berechtigte Frage? Ich habe eine .NET Windows-App, die MSTDC verwendet und eine Ausnahme auslöst:

System.Transactions.TransactionManagerCommunicationException: Der Netzwerkzugriff für Distributed Transaction Manager (MSDTC) wurde deaktiviert. Aktivieren Sie DTC für den Netzwerkzugriff in der Sicherheitskonfiguration für MSDTC mit dem Component Services-Verwaltungstool ---> System.Runtime.InteropServices.COMException (0x8004D024): Der Transaktionsmanager hat die Unterstützung für Remote- / Netzwerktransaktionen deaktiviert. (Ausnahme von HRESULT: 0x8004D024) unter System.Transactions.Oletx.IDtcProxyShimFactory.ReceiveTransaction

Ich habe die Kbalertz-Anleitung befolgt, um MSDTC auf dem PC zu aktivieren, auf dem die App installiert ist, aber der Fehler tritt weiterhin auf.

Ich habe mich gefragt, ob dies ein Datenbankproblem ist. Wenn ja, wie kann ich das Problem beheben?

Dan
quelle
Wenn die genannten Lösungen das Problem nicht lösen, überprüfen Sie diesen Link
Shahab J

Antworten:

127

Verwenden Sie diese Option für Windows Server 2008 R2 und Windows Server 2012 R2

  1. Klicken Sie auf Start , klicken Sie auf Ausführen , geben Sie dcomcnfg ein und klicken Sie dann auf OK , um die Komponentendienste zu öffnen .

  2. Klicken Sie in der Konsolenstruktur auf Komponentendienste , auf Computer , auf Arbeitsplatz , auf Distributed Transaction Coordinator und dann auf Local DTC .

  3. Klicken Sie mit der rechten Maustaste auf Lokaler DTC und klicken Sie auf Eigenschaften , um das Dialogfeld Lokale DTC-Eigenschaften anzuzeigen .

  4. Klicken Sie auf die Registerkarte Sicherheit .

  5. Aktivieren Sie das Kontrollkästchen "Network DTC Access" .

  6. Aktivieren Sie abschließend die Kontrollkästchen "Eingehende zulassen" und "Ausgehende zulassen" .

  7. Klicken Sie auf Übernehmen , OK .

  8. Es wird eine Meldung zum Neustart des Dienstes angezeigt .

  9. Klicken Sie auf OK und das ist alles.

Referenz: https://msdn.microsoft.com/en-us/library/dd327979.aspx

Hinweis: Manchmal ist der Netzwerk - Firewall auf dem lokalen Computer oder den Server könnte die Verbindung unterbrechen , so stellen Sie sicher , Sie erstellen Regeln „Eingehende zulassen“ und „Ausgehende zulassen“ Verbindung fürC:\Windows\System32\msdtc.exe

Shiv Singh
quelle
Funktioniert auch für Windows Server 2012 R2. Danke für die klaren Anweisungen. Hätte ich alleine nie gefunden!
Jonazu
@jonazu jetzt habe ich Antwort für Windows Server 2012 R2 auch aktualisiert :)
Shiv Singh
Gute Arbeit ShivSingh!
Super Coder
Der richtige Weg msdtc.exeist:c:\windows\system32\msdtc.exe
Firepol
1
Es scheint einen Fehler zu geben, bei dem diese Eigenschaften nicht erhalten bleiben, wenn sie über die Benutzeroberfläche festgelegt werden, zumindest nicht auf Clustered Server 2016-Knoten. Die Lösung besteht darin, diese Eigenschaften manuell in der Registrierung festzulegen : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\Security. Weitere Infos zu den Eigenschaften hier .
Paul
102

Benötigen Sie überhaupt MSDTC? Die eskalierende Eskalation wird häufig durch das Erstellen mehrerer Verbindungen innerhalb eines einzelnen TransactionScope verursacht.

Wenn Sie es benötigen, müssen Sie es wie in der Fehlermeldung beschrieben aktivieren. Unter XP:

  • Gehen Sie zu Verwaltung -> Komponentendienste
  • Erweitern Sie Komponentendienste -> Computer ->
  • Klicken Sie mit der rechten Maustaste -> Eigenschaften -> Registerkarte MSDTC
  • Klicken Sie auf die Schaltfläche Sicherheitskonfiguration
Andrew Peters
quelle
2
Auch in der Windows-Firewall habe ich Port 135 TCP geöffnet und ausnahmsweise c: \ windows \ msdtc.exe hinzugefügt
Sameer Alibhai
20
Vielen Dank für den Kommentar zu dem Fehler, der durch das Erstellen mehrerer Verbindungen in einem einzelnen TransactionScope verursacht wird. Ich habe den Fehler bekommen und das war genau das Problem. Ich wollte den MSDTC nicht verwenden, habe also die fehlerhafte neue Verbindung gefunden und eine vorhandene wiederverwendet. Vielen Dank!
Jim McKeeth
10
Ich bin unter Windows 7 und 8 und es gibt nur einen Abschnitt "Standardkoordinator". Wo kann ich zu der Sicherheitskonfiguration gelangen, über die Sie sprechen?
Qdev76
2
1) Klicken Sie mit der rechten Maustaste auf Lokaler DTC und wählen Sie Eigenschaften. 2) Öffnen Sie die Registerkarte Sicherheit. 3) Überprüfen Sie mindestens den Netzwerk-DTC-Zugriff, erlauben Sie Remote-Clients und lassen Sie eingehende Nachrichten zu.
Rob Sedgwick
19

Ich habe festgestellt, dass der beste Weg zum Debuggen die Verwendung des Microsoft-Tools namens DTCPing ist

  1. Kopieren Sie die Datei sowohl auf den Server (DB) als auch auf den Client (Anwendungsserver / Client-PC).
    • Starten Sie es auf dem Server und dem Client
    • Auf dem Server: Geben Sie den Computernamen des Client-NetBIOS ein und versuchen Sie, eine DTC-Verbindung herzustellen
    • Starten Sie beide Anwendungen neu.
    • Auf dem Client: Geben Sie den Computernamen des Server-NetBIOS ein und versuchen Sie, eine DTC-Verbindung herzustellen

Ich hatte einige Probleme in unserem alten Firmennetzwerk und habe ein paar Tipps:

  • Wenn Sie die Fehlermeldung "Gethostbyname failed" erhalten, bedeutet dies, dass der Computer den anderen Computer nicht anhand seines NetBIOS-Namens finden kann . Der Server könnte beispielsweise den Client auflösen und anpingen, dies funktioniert jedoch auf DNS-Ebene. Nicht auf Netbios-Suchebene. Die Verwendung von WINS-Servern oder das Ändern des LMHOST (Dirty) löst dieses Problem.
  • Wenn die Fehlermeldung "Zugriff verweigert" angezeigt wird, stimmen die Sicherheitseinstellungen nicht überein. Sie sollten die Registerkarte Sicherheit für msdtc vergleichen und sicherstellen, dass Server und Client übereinstimmen. Eine andere Sache, die Sie sich ansehen sollten, ist der RestrictRemoteClients- Wert. Abhängig von Ihrer Betriebssystemversion und vor allem vom Service Pack kann dieser Wert unterschiedlich sein.
  • Andere Verbindungsprobleme:
    • Die Firewall zwischen dem Server und dem Client muss die Kommunikation über Port 135 ermöglichen. Und was noch wichtiger ist, die Verbindung kann von beiden Standorten aus initiiert werden (ich hatte viele Probleme mit den Firewall-Mitarbeitern in meinem Unternehmen, da davon ausgegangen wurde, dass nur der Server eine Verbindung herstellen würde weiter zu diesem Hafen)
    • Das Protokoll gibt einen zufälligen Port zurück, mit dem eine Verbindung für die eigentliche Transaktionskommunikation hergestellt werden soll. Firewall-Leute mögen das nicht, sie beschränken die Ports gerne auf einen bestimmten Bereich. Sie können die Generierung dynamischer RPC-Ports mithilfe der Schlüssel auf einen bestimmten Bereich beschränken, wie unter Konfigurieren der dynamischen RPC-Portzuweisung für die Arbeit mit Firewalls beschrieben .

Wenn der DTCPing meiner Erfahrung nach eine vom Client initiierte und vom Server initiierte DTC-Verbindung herstellen kann, sind Ihre Transaktionen nicht mehr das Problem.

Davy Landman
quelle
6

Hier erfahren Sie auch , wie Sie MSDTC in der Datei services.msc der Systemsteuerung aktivieren.

Auf dem Server, auf dem sich der Trigger befindet, müssen Sie den MSDTC-Dienst aktivieren. Klicken Sie dazu auf START> EINSTELLUNGEN> BEDIENFELD> ADMINISTRATIVE WERKZEUGE> DIENSTLEISTUNGEN. Suchen Sie den Dienst "Distributed Transaction Coordinator" und klicken Sie mit der rechten Maustaste (darauf und wählen Sie)> Start.

Cameron Castillo
quelle
4

MSDTC muss auf beiden Systemen aktiviert sein, sowohl auf dem Server als auch auf dem Client.
Stellen Sie außerdem sicher, dass zwischen den Systemen, die RPC blockieren, keine Firewall vorhanden ist.
DTCTest ist eine nette kleine App, mit der Sie andere Probleme beheben können.

Lars Mæhlum
quelle
Ich denke, dies ist der neue Standort microsoft.com/en-us/download/details.aspx?id=30746
Air2
4

@Dan,

Muss msdtc nicht aktiviert sein, damit Transaktionen funktionieren?

Nur verteilte Transaktionen - Transaktionen, die mehr als eine einzelne Verbindung umfassen. Stellen Sie doppelt sicher, dass Sie nur eine einzige Verbindung innerhalb der Transaktion öffnen und diese nicht eskaliert - die Leistung wird auch viel besser.

Andrew Peters
quelle
Muss msdtc nicht aktiviert sein, damit Transaktionen funktionieren? In beiden Fällen werden meines Wissens nicht mehrere Verbindungen hergestellt. Ich habe diese Schritte bereits auf dem Client-PC ausgeführt. Wollen Sie damit sagen, dass ich diese Schritte auch auf dem Datenbankserver ausführen soll?
Dan
@Dan, Sie müssen DTC nicht aktivieren, wenn Sie ado.net-Transaktionen verwenden. Sie müssen MSDTC auf dem Server nur aktivieren, wenn Sie verteilte Transaktionen verwenden
Niraj