Nie można rozpocząć transakcji rozproszonej

97

Próbuję uruchomić SQL na połączonym serwerze, ale otrzymuję poniższe błędy:

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.

Dostawca zwrócił dwa błędy:

Błąd 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

Błąd 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

Jak przekonać firmę Microsoft do przedkładania funkcjonalności nad bezpieczeństwem?

Albo przynajmniej, jak mogę zmusić dwa serwery SQL, aby rozmawiały ze sobą?

Powiązane pytania


Co mi się zrobić to bez znaczenia, ale będę pisać tak.

  1. Upewnij się, że Distributed Transaction Coordinatorusługa działa na obu maszynach:

    wprowadź opis obrazu tutaj

    wprowadź opis obrazu tutaj

  2. Wyłącz wszystkie zabezpieczenia MSDTC na obu komputerach:

    wprowadź opis obrazu tutaj

    wprowadź opis obrazu tutaj

  3. Włącz losowe opcje na połączonym serwerze:

wprowadź opis obrazu tutaj

  1. Przeklęty i przeklęty.

  2. Rozwalone rzeczy.

  3. Sprawdzono, czy SELECTmoże korzystać z serwera połączonego :

        SELECT * FROM ASILive.CustomerManagementSystem.dbo.Users
        ....
    
        (763 row(s) affected)
    
  4. Sprawdzono, że serwer klienta może pingserwer zdalny :

         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. Sprawdzono, czy zdalny serwer może komunikować się z powrotem, po nazwie, z serwerem inicjującym:

         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. Zaznaczone, że @@SERVERNAMEpasuje do nazwy serwera na obu serwerach :

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

    i

       SELECT @@SERVERNAME, SERVERPROPERTY('MachineName')
    
       ----------  ----------
       ASIGROBTEST  ASIGROBTEST
    
  7. Krzyknęła

  8. Wydane SET XACT_ABORT ONprzed wysłaniem zapytania :

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

    HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer
    

    na obu serwerach.

Ian Boyd
źródło
31
dobrze widzieć, że nie pominąłeś kluczowego kroku „przeklęty i przysięgły”!
jwl
11
@joelarson Hej, czasami ludzie są bardzo skrupulatni, że śledzisz każdy krok. nie chciałem, żeby ktokolwiek mówił, że czegoś nie próbowałem.
Ian Boyd
5
Uwielbiam ten post. Charakteryzuje każde doświadczenie, jakie kiedykolwiek miałem z MSDTC.
A. Murray
5
W moim przypadku, po ustawieniu „Włącz promowanie transakcji rozproszonych dla RPC” na Fałsz na połączonym serwerze, działa. Może spróbuj tego
Sarsaparilla
3
@HaiPhan Wyłączenie korzystania z transakcji rozproszonych łamie międzynarodową integralność: wycofanie zmian na serwerze lokalnym oznacza, że ​​zmiany pozostaną na serwerze zdalnym. Bardzo niebezpieczne.
Ian Boyd

Odpowiedzi:

31

Znalazłem to, MSDTC na serwerze zdalnym był klonem serwera lokalnego.

Z dziennika zdarzeń aplikacji systemu Windows:

Typ zdarzenia: Błąd
Źródło zdarzenia: MSDTC
Kategoria zdarzenia: CM
Identyfikator zdarzenia: 4101
Data: 19.09.2011
Godzina: 13:32:59
Użytkownik: Brak
Komputer: ASITESTSERVER
Opis:

Lokalna usługa MS DTC wykryła, że ​​usługa MS DTC w ASICMSTEST ma tę samą unikalną tożsamość, co lokalna usługa MS DTC. Oznacza to, że dwa MS DTC nie będą w stanie komunikować się ze sobą. Ten problem zwykle występuje, jeśli jeden z systemów został sklonowany przy użyciu nieobsługiwanych narzędzi do klonowania. Usługa MS DTC wymaga, aby systemy były klonowane przy użyciu obsługiwanych narzędzi do klonowania, takich jak SYSPREP. Uruchomienie polecenia „msdtc -uninstall”, a następnie „msdtc -install” w wierszu polecenia rozwiązuje problem. Uwaga: uruchomienie „msdtc -uninstall” spowoduje utratę przez system wszystkich informacji o konfiguracji usługi MS DTC.

Więcej informacji można znaleźć w Centrum pomocy i obsługi technicznej pod adresem http://go.microsoft.com/fwlink/events.asp .

Bieganie

msdtc -uninstall
msdtc -install

a następnie zatrzymanie i ponowne uruchomienie usługi SQL Server rozwiązało problem.

Ian Boyd
źródło
2
Zobaczmy, czy mam rację: 1- msdtc -uninstall 2- msdtc -install 3- zrestartuj usługę SQL Server 4- zrestartuj usługę SQL Agent, dla pewności 5- nawet uruchom ponownie usługę „Distributed Transaction Coordinator” ... Zrobiłem to wszystko na obu maszynach (serwerze głównym i serwerze połączonym) a ~ i nic, wciąż ten sam błąd!
Hamid Sadeghian
11

Udało mi się rozwiązać ten problem (jak inni wspominali w komentarzach), wyłączając opcję „Włącz promowanie transakcji rozproszonych dla RPC” (tj. Ustawiając ją na False):

wprowadź opis obrazu tutaj

Zgodnie z prośbą @WonderWorker możesz to zrobić za pomocą skryptu SQL:

EXEC master.dbo.sp_serveroption
     @server = N'[mylinkedserver]',
     @optname = N'remote proc transaction promotion',
     @optvalue = N'false'
Steve Bauman
źródło
1
To zadziałało dla mnie. Co dziwne, od tygodni było dobrze, a potem nagle się zaczęło. Prawdopodobnie dlatego, że usługa DTC serwera zdalnego może być wyłączona. Mimo wszystko dziękuję.
Boyd P
1
Znakomity. Czy znasz sposób na napisanie tego? Na wszystkich moich serwerach wszystkie połączone obiekty serwerów miały włączoną promocję transakcji rozproszonych ustawioną na wartość true i nie byłem jeszcze w stanie dowiedzieć się, kto to zrobił. To takie nudne.
WonderWorker
1
@WonderWorker Właśnie dodałem przykładowy skrypt SQL, którego możesz użyć, daj mu szansę!
Steve Bauman
6

OK, więc usługi są uruchomione, jest między nimi ścieżka Ethernet, działa rozpoznawanie nazw, połączone serwery działają, a uwierzytelnianie transakcji zostało wyłączone.

Moje przeczucie mówi, że problem z zaporą ogniową, ale kilka rzeczy przychodzi mi do głowy ...

  1. Czy komputery są w tej samej domenie? (tak, nie powinno mieć znaczenia przy wyłączonym uwierzytelnianiu)
  2. Czy na komputerach działają zapory ogniowe? DTC może być trochę uciążliwe dla zapór, ponieważ wykorzystuje szereg portów, patrz http://support.microsoft.com/kb/306843 Na razie wyłączyłbym zapory ogniowe w celu zidentyfikowania problemu
  3. Co mówi ping DTC? http://www.microsoft.com/download/en/details.aspx?id=2868
  4. Na jakim koncie działa usługa SQL?
EBarr
źródło
2

Jeśli serwery są w klastrze i istnieje klastrowana usługa DTC, należy wyłączyć zabezpieczenia w klastrowej usłudze DTC, a nie lokalnej.

David Wolfinger
źródło
1

Jeśli serwer docelowy znajduje się w innej chmurze lub centrum danych, należy dodać wpis hosta usługi MSDTC (serwer docelowy) na serwerze źródłowym.

Spróbuj tego, jeśli problem nie został rozwiązany, po włączeniu ustawień usługi MSDTC.

NOCNIK
źródło
1

Dla mnie dotyczy to ustawienia zapory. Przejdź do ustawień zapory, zezwól na usługę DTC i zadziałało.wprowadź opis obrazu tutaj

Hoang Tran
źródło
0

Moja ostatnia przygoda z MSDTC i tym błędem dzisiaj okazała się problemem DNS. Jesteś na dobrej drodze, pytając, czy komputery są w tej samej domenie, EBarr. Nawiasem mówiąc, świetna lista tego wydania!

Moja sytuacja: potrzebowałem serwera w domenie podrzędnej, aby móc przeprowadzać transakcje rozproszone na serwerze w domenie nadrzędnej za pośrednictwem zapory. Przez lata korzystałem z serwerów połączonych, więc miałem wszystkie zwykłe ustawienia w SQL dla serwera połączonego i MSDTC, które Ian tak ładnie udokumentował powyżej. Skonfigurowałem MSDTC z szeregiem portów TCP (5000-5200) do użycia na obu serwerach i zorganizowałem otwór w zaporze ogniowej między skrzynkami dla portów 1433 i 5000-5200. To powinno zadziałać. Połączony serwer przetestował OK i mogłem ładnie odpytać zdalny serwer SQL za pośrednictwem połączonego serwera, ale nie mogłem go przekonać, aby zezwolił na rozproszoną transakcję. Mogłem nawet zobaczyć połączenie na serwerze QA z serwera DEV, ale coś nie powodowało powrotu.

Mogłem PINGować serwer DEV z QA przy użyciu FQDN, na przykład: PING DEVSQL.dev.domain.com

Nie mogłem PINGować serwera DEV przy użyciu samej nazwy komputera: PING DEVSQL

Serwer DEVSQL miał być członkiem obu domen, ale nazwa nie była rozpoznawana w DNS domeny nadrzędnej ... coś się stało z kontem maszyny dla DEVSQL w domenie nadrzędnej. Gdy dodaliśmy DEVSQL do DNS domeny nadrzędnej i „PING DEVSQL” działało ze zdalnego serwera QA, problem został rozwiązany za nas.

Mam nadzieję, że to pomoże!

Marck
źródło
0

Oprócz ustawień bezpieczeństwa musiałem otworzyć niektóre porty na obu serwerach, aby transakcja została uruchomiona. Musiałem otworzyć port 59640, ale zgodnie z poniższą sugestią port 135 musi być otwarty. http://support.microsoft.com/kb/839279

Trepach
źródło
0

Otrzymałem ten sam błąd i udało mi się go rozwiązać, odpowiednio konfigurując usługę MSDTC na serwerze źródłowym, aby zezwolić na wychodzenie i zezwolenie na DTC przez zaporę systemu Windows.

Pozwól Koordynatorowi transakcji rozproszonych, zaznacz domenę, opcje prywatne i publiczne

Kaawach Said
źródło