Jak włączyć usługę MSDTC w programie SQL Server?

106

Czy to w ogóle ważne pytanie? Mam aplikację .NET dla systemu Windows, która korzysta z MSTDC i zgłasza wyjątek:

System.Transactions.TransactionManagerCommunicationException: Dostęp sieciowy dla Menedżera transakcji rozproszonych (MSDTC) został wyłączony. Włącz usługę DTC dla dostępu do sieci w konfiguracji zabezpieczeń usługi MSDTC za pomocą narzędzia administracyjnego usług składowych ---> System.Runtime.InteropServices.COMException (0x8004D024): Menedżer transakcji wyłączył obsługę transakcji zdalnych / sieciowych. (Wyjątek od HRESULT: 0x8004D024) w System.Transactions.Oletx.IDtcProxyShimFactory.ReceiveTransaction (UInt32 propgationTokenSize, Byte [] propgationToken, IntPtr managedIdentifier, Guid & transactionIdentifier, OletxTransactionIsolationLevel & Transaction Isolation ....

Postępowałem zgodnie z przewodnikiem Kbalertz, aby włączyć usługę MSDTC na komputerze, na którym jest zainstalowana aplikacja, ale błąd nadal występuje.

Zastanawiałem się, czy to problem z bazą danych? Jeśli tak, jak mogę to rozwiązać?

Dan
źródło
Jeśli wspomniane rozwiązania nie rozwiązują problemu, sprawdź ten link
Shahab J

Odpowiedzi:

127

Użyj tego w przypadku systemu Windows Server 2008 R2 i Windows Server 2012 R2

  1. Kliknij przycisk Start , kliknij polecenie Uruchom , wpisz dcomcnfg, a następnie kliknij przycisk OK, aby otworzyć Usługi składowe .

  2. W drzewie konsoli kliknij, aby rozwinąć Usługi składowe , kliknij, aby rozwinąć Komputery , kliknij, aby rozwinąć Mój komputer , kliknij, aby rozwinąć Koordynator transakcji rozproszonych, a następnie kliknij Lokalna usługa DTC .

  3. Kliknij prawym przyciskiem myszy Lokalny DTC i kliknij Właściwości, aby wyświetlić okno dialogowe Właściwości Lokalnej usługi DTC .

  4. Kliknij kartę Bezpieczeństwo .

  5. Zaznacz pole wyboru „Network DTC Access” .

  6. Na koniec zaznacz pola wyboru „Zezwalaj na przychodzące” i „Zezwalaj na wychodzące” .

  7. Kliknij Zastosuj , OK .

  8. Pojawi się komunikat o ponownym uruchomieniu usługi.

  9. Kliknij OK i to wszystko.

Źródła: https://msdn.microsoft.com/en-us/library/dd327979.aspx

Uwaga: czasami zapora sieciowa na komputerze lokalnym lub serwerze może przerwać połączenie, więc upewnij się, że utworzyłeś reguły „Zezwalaj na przychodzące” i „Zezwalaj na połączenia wychodzące” dlaC:\Windows\System32\msdtc.exe

Shiv Singh
źródło
Działa również w systemie Windows Server 2012 R2. Dzięki za jasne instrukcje. Nigdy bym tego nie znalazł sam!
jonazu
@jonazu teraz zaktualizowałem również odpowiedź dla systemu Windows Server 2012 R2 :)
Shiv Singh
Dobra robota ShivSingh!
Super Coder
Prawidłowa ścieżka msdtc.exeto:c:\windows\system32\msdtc.exe
firepol
1
Wydaje się, że występuje błąd polegający na tym, że te właściwości nie pozostają przy ustawieniu za pośrednictwem interfejsu użytkownika, przynajmniej w klastrowanych węzłach Server 2016. Rozwiązaniem jest ręcznie ustawić te właściwości w rejestrze: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\Security. Więcej informacji o nieruchomościach tutaj .
Paweł
102

Czy w ogóle potrzebujesz usługi MSDTC? Eskalacja, której doświadczasz, jest często spowodowana tworzeniem wielu połączeń w ramach jednego TransactionScope.

Jeśli go potrzebujesz, musisz go włączyć zgodnie z opisem w komunikacie o błędzie. Na XP:

  • Przejdź do Narzędzia administracyjne -> Usługi składowe
  • Rozwiń Usługi składowe -> Komputery ->
  • Kliknij prawym przyciskiem myszy -> Właściwości -> karta MSDTC
  • Kliknij przycisk Konfiguracja zabezpieczeń
Andrew Peters
źródło
2
Również w zaporze systemu Windows otworzyłem port 135 TCP i dodałem c: \ windows \ msdtc.exe jako wyjątek
Sameer Alibhai
20
Dziękujemy za komentarz dotyczący błędu spowodowanego tworzeniem wielu połączeń w ramach jednego TransactionScope. Otrzymywałem błąd i to był dokładnie problem. Nie chciałem korzystać z usługi MSDTC, więc znalazłem błędne nowe połączenie i ponownie wykorzystałem istniejące. Dzięki!
Jim McKeeth
10
Pracuję w systemie Windows 7 i 8 i jest tam tylko sekcja „Domyślny koordynator”. Gdzie mogę znaleźć konfigurację zabezpieczeń, o której mówisz?
qdev76
2
1) Kliknij prawym przyciskiem myszy Lokalną usługę DTC i wybierz właściwości 2) Otwórz kartę zabezpieczeń 3) Zaznacz przynajmniej Network DTC Access, Allow Remote Clients i Allow Inbound.
Rob Sedgwick
19

Odkryłem, że najlepszym sposobem debugowania jest użycie narzędzia Microsoft o nazwie DTCPing

  1. Skopiuj plik zarówno na serwer (DB), jak i na klienta (serwer aplikacji / komputer kliencki)
    • Uruchom go na serwerze i kliencie
    • Na serwerze: wprowadź nazwę komputera klienta netbios i spróbuj skonfigurować połączenie DTC
    • Uruchom ponownie obie aplikacje.
    • Na kliencie: wprowadź nazwę komputera netbios serwera i spróbuj skonfigurować połączenie DTC

Miałem problemy z taryfą w naszej starej sieci firmowej i mam kilka wskazówek:

  • jeśli pojawi się komunikat o błędzie „Gethostbyname failed” oznacza to, że komputer nie może znaleźć drugiego komputera na podstawie swojej nazwy netbios . Serwer mógłby na przykład rozwiązać problem i wysłać polecenie ping do klienta, ale działa to na poziomie DNS. Nie na poziomie wyszukiwania netbios. Użycie serwerów WINS lub zmiana LMHOST (brudny) rozwiąże ten problem.
  • jeśli pojawi się błąd „Odmowa dostępu”, ustawienia zabezpieczeń nie są zgodne. Powinieneś porównać zakładkę bezpieczeństwa dla msdtc i dopasować serwer i klienta. Jeszcze jedna rzecz, na którą należy zwrócić uwagę, to RestrictRemoteClients wartość . W zależności od wersji systemu operacyjnego i, co ważniejsze, dodatku Service Pack, ta wartość może być inna.
  • Inne problemy z połączeniem:
    • Firewall pomiędzy serwerem a klientem musi pozwalać na komunikację przez port 135. I co ważniejsze połączenie może być zainicjowane z obu stron (miałem sporo problemów z firewallami w mojej firmie ponieważ zakładali, że tylko serwer otworzy połączenie do tego portu)
    • Protokół zwraca losowy port, z którym można się połączyć w celu prawdziwej komunikacji transakcji. Ludziom zapory sieciowej się to nie podoba, lubią ograniczać porty do określonego zakresu. Możesz ograniczyć generowanie dynamicznego portu RPC do określonego zakresu przy użyciu kluczy opisanych w sekcji Jak skonfigurować dynamiczne przydzielanie portu RPC do pracy z zaporami .

Z mojego doświadczenia wynika, że ​​jeśli DTCPing jest w stanie skonfigurować połączenie DTC zainicjowane przez klienta i zainicjowane z serwera, Twoje transakcje nie są już problemem.

Davy Landman
źródło
6

Można tu również zobaczyć , jak włączyć usługę MSDTC z poziomu services.msc Panelu sterowania.

Na serwerze, na którym znajduje się wyzwalacz, należy włączyć usługę MSDTC. Możesz to zrobić, klikając START> USTAWIENIA> PANEL STEROWANIA> NARZĘDZIA ADMINISTRACYJNE> USŁUGI. Znajdź usługę o nazwie „Koordynator transakcji rozproszonych” i KLIKNIJ PRAWYM PRZYCISKIEM (na niej i wybierz)> Start.

Cameron Castillo
źródło
4

Usługa MSDTC musi być włączona w obu systemach, zarówno na serwerze, jak i na kliencie.
Upewnij się również, że między systemami nie ma zapory, która blokuje RPC.
DTCTest to fajna aplikacja, która pomaga w rozwiązywaniu innych problemów.

Lars Mæhlum
źródło
Myślę, że to nowa lokalizacja microsoft.com/en-us/download/details.aspx?id=30746
Air2
4

@Dan,

Czy nie potrzebuję włączonego msdtc, aby transakcje działały?

Tylko transakcje rozproszone - te, które obejmują więcej niż jedno połączenie. Upewnij się podwójnie, że otwierasz tylko jedno połączenie w ramach transakcji i nie dojdzie do eskalacji - wydajność również będzie znacznie lepsza.

Andrew Peters
źródło
Czy nie potrzebuję włączonego msdtc, aby transakcje działały? Tak czy inaczej, o ile wiem, wiele połączeń nie jest wykonywanych. Wykonałem już te kroki na komputerze klienckim, czy mówisz, że powinienem również wykonać te kroki na serwerze bazy danych?
Dan,
@Dan, nie musisz włączać usługi DTC, jeśli korzystasz z transakcji ado.net. Musisz włączyć usługę MSDTC na serwerze tylko w przypadku korzystania z transakcji rozproszonych
Niraj