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
- Nie można wykonać operacji, ponieważ dostawca OLE DB „SQLNCLI10” ... (* nazwa serwera połączonego to
(null)
) - Błąd transakcji rozproszonej? ( przy użyciu dostawcy Oracle )
- Nie można zarejestrować się w transakcji rozproszonej z NHibernate ( przy użyciu Hibernate )
- Błąd podczas korzystania z transakcji rozproszonej w programie SQL Server 2008 R2 ( SQL Server 2008 R2, brak odpowiedzi )
- Błąd transakcji rozproszonej tylko poprzez kod ( spowodowany przez pule połączeń )
- Błąd podczas wykonywania rozproszonego koordynatora transakcji na serwerze połączonym ( SQL Server 2008, brak odpowiedzi )
- Błąd transakcji rozproszonej? ( brak zaakceptowanej odpowiedzi; sama odpowiedź nie pomaga )
- Jak wstawić do zdalnej tabeli za pomocą serwera połączonego bez transakcji? ( zaakceptowana odpowiedź nie rozwiązuje się )
Co mi się zrobić to bez znaczenia, ale będę pisać tak.
Upewnij się, że
Distributed Transaction Coordinator
usługa działa na obu maszynach:Wyłącz wszystkie zabezpieczenia MSDTC na obu komputerach:
Włącz losowe opcje na połączonym serwerze:
Przeklęty i przeklęty.
Rozwalone rzeczy.
Sprawdzono, czy
SELECT
może korzystać z serwera połączonego :SELECT * FROM ASILive.CustomerManagementSystem.dbo.Users .... (763 row(s) affected)
Sprawdzono, że serwer klienta może
ping
serwer 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
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
Zaznaczone, że
@@SERVERNAME
pasuje do nazwy serwera na obu serwerach :SELECT @@SERVERNAME, SERVERPROPERTY('MachineName') ------------- ------------- ASITESTSERVER ASITESTSERVER
i
SELECT @@SERVERNAME, SERVERPROPERTY('MachineName') ---------- ---------- ASIGROBTEST ASIGROBTEST
Krzyknęła
Wydane
SET XACT_ABORT ON
przed wysłaniem zapytania :SET XACT_ABORT ON GO BEGIN DISTRIBUTED TRANSACTION SELECT TOP 1 * FROM Sessions
Przyznane
Everyone
Full Control
na :HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer
na obu serwerach.
Odpowiedzi:
Znalazłem to, MSDTC na serwerze zdalnym był klonem serwera lokalnego.
Z dziennika zdarzeń aplikacji systemu Windows:
Bieganie
msdtc -uninstall msdtc -install
a następnie zatrzymanie i ponowne uruchomienie usługi SQL Server rozwiązało problem.
źródło
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
):Zgodnie z prośbą @WonderWorker możesz to zrobić za pomocą skryptu SQL:
źródło
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 ...
źródło
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.
źródło
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.
źródło
Dla mnie dotyczy to ustawienia zapory. Przejdź do ustawień zapory, zezwól na usługę DTC i zadziałało.
źródło
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!
źródło
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
źródło
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
źródło