분산 트랜잭션을 시작할 수 없습니다.


95

연결된 서버에 대해 SQL을 실행하려고하는데 아래 오류가 발생합니다.

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.

공급자가 반환 한 두 가지 오류가 있습니다.

오류 # 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

오류 # 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

Microsoft가 보안보다 기능을 선호하도록하려면 어떻게해야합니까?

또는 적어도 두 개의 SQL 서버가 서로 통신하도록하려면 어떻게해야합니까?

관련 질문


내가 일은 관련이 없지만 어쨌든 게시하겠습니다.

  1. Distributed Transaction Coordinator두 시스템에서 서비스가 실행 중인지 확인하십시오 .

    여기에 이미지 설명 입력

    여기에 이미지 설명 입력

  2. 두 컴퓨터에서 모든 MSDTC 보안을 비활성화합니다.

    여기에 이미지 설명 입력

    여기에 이미지 설명 입력

  3. 연결된 서버에서 임의 옵션을 켭니다.

여기에 이미지 설명 입력

  1. 저주와 맹세.

  2. 박살난 것들.

  3. 연결된 서버를SELECT 사용할 수 있는지 확인했습니다 .

        SELECT * FROM ASILive.CustomerManagementSystem.dbo.Users
        ....
    
        (763 row(s) affected)
    
  4. 클라이언트 서버가 ping원격 서버가 될 수 있는지 확인했습니다 .

         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. 원격 서버가 이름으로 시작 서버로 다시 통신 할 수 있는지 확인했습니다.

         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. @@SERVERNAME두 서버의 서버 이름과 일치 하는지 확인했습니다 .

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

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

  8. SET XACT_ABORT ON내 쿼리를 발행 하기 전에 발행 :

    SET XACT_ABORT ON
    GO
    BEGIN DISTRIBUTED TRANSACTION
    SELECT TOP 1 * FROM Sessions
    
  9. 부여 Everyone Full Control대상 :

    HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer

    두 서버에서.


30
중요한 "저주와 맹세"단계를 건너 뛰지 않았다 니 반갑습니다!
jwl 2013 년

11
@joelarson 안녕하세요, 때때로 사람들은 당신이 모든 단계 를 따르는 매우 특별합니다 . 나는 누군가가 내가 뭔가를 시도하지 않았다고 말하는 것을 원하지 않았습니다.
Ian Boyd

5
나는이 포스트를 좋아한다. 그것은 내가 MSDTC를 통해 경험 한 모든 것을 대표합니다.
A. Murray

5
필자의 경우 연결된 서버에서 "RPC에 대한 분산 트랜잭션 승격 활성화"를 False로 설정하면 작동합니다. 시도해보세요
Sarsaparilla

3
@HaiPhan 분산 트랜잭션 사용을 끄면 초 국가적 무결성이 깨집니다. 로컬 서버에서 변경 사항을 롤백하면 변경 사항이 원격 서버에 그대로 유지됩니다. 매우 위험한.
Ian Boyd

답변:


31

찾았습니다. 원격 서버의 MSDTC는 로컬 서버의 복제본입니다.

Windows 애플리케이션 이벤트 로그에서 :

이벤트 종류 : 오류
이벤트 원본 : MSDTC
이벤트 범주 : CM
이벤트 ID : 4101
날짜
: 9/19/2011 시간 : 오후 1:32:59
사용자 : N / A
컴퓨터 : ASITESTSERVER
설명 :

로컬 MS DTC는 ASICMSTEST의 MS DTC가 로컬 MS DTC와 동일한 고유 ID를 가지고 있음을 감지했습니다. 이는 두 MS DTC가 서로 통신 할 수 없음을 의미합니다. 이 문제는 일반적으로 시스템 중 하나가 지원되지 않는 복제 도구를 사용하여 복제 된 경우 발생합니다. MS DTC를 사용하려면 SYSPREP와 같은 지원되는 복제 도구를 사용하여 시스템을 복제해야합니다. 명령 프롬프트에서 'msdtc -uninstall'을 실행 한 다음 'msdtc -install'을 실행하면 문제가 해결됩니다. 참고 : 'msdtc -uninstall'을 실행하면 시스템에서 모든 MS DTC 구성 정보가 손실됩니다.

자세한 내용은 http://go.microsoft.com/fwlink/events.asp의 도움말 및 지원 센터를 참조하십시오 .

달리는

msdtc -uninstall
msdtc -install

SQL Server 서비스를 중지했다가 다시 시작하면 문제가 해결되었습니다.


2
내가 제대로했는지 보자. 1- msdtc -uninstall 2- msdtc -install 3- SQL Server 서비스 다시 시작 4- SQL Agent 서비스를 다시 시작하십시오. 5- "Distributed Transaction Coordinator"서비스도 다시 시작하십시오. 나는 두 컴퓨터 (주 서버 및 연결된 서버) 에서이 모든 작업을 수행했습니다. 아무것도 여전히 같은 오류입니다!
하미드 Sadeghian

9

"RPC에 대한 분산 트랜잭션 승격 활성화"(즉,로 설정)를 비활성화하여이 문제를 해결할 수있었습니다 (다른 사람들이 의견에서 언급했듯이 False).

여기에 이미지 설명 입력


1
이것은 나를 위해 일했습니다. 이상한 것은 몇 주 동안 괜찮았다가 갑자기 시작되었다는 것입니다. 원격 서버의 DTC 서비스가 비활성화되었을 수 있기 때문일 수 있습니다. 아무튼 감사 해요.
Boyd P

6

좋습니다. 서비스가 시작되고 그 사이에 이더넷 경로가 있고 이름 확인이 작동하고 연결된 서버가 작동하며 트랜잭션 인증을 비활성화했습니다.

내 직감은 방화벽 문제라고 말하지만 몇 가지가 떠오른다 ...

  1. 머신이 동일한 도메인에 있습니까? (예, 비활성화 된 인증은 중요하지 않습니다)
  2. 컴퓨터에서 방화벽이 실행되고 있습니까? DTC는 다양한 포트를 사용하므로 방화벽에 약간의 고통이 될 수 있습니다. http://support.microsoft.com/kb/306843을 참조 하십시오 . 당분간은 문제를 식별하기 위해 방화벽을 비활성화합니다.
  3. DTC 핑은 무엇을 말합니까? http://www.microsoft.com/download/en/details.aspx?id=2868
  4. SQL 서비스는 어떤 계정으로 실행됩니까?

2

서버가 클러스터되고 클러스터 된 DTC가있는 경우 로컬 DTC가 아닌 클러스터 된 DTC에서 보안을 해제해야합니다.


1

대상 서버가 다른 클라우드 또는 데이터 센터에있는 경우 원본 서버 에 MSDTC 서비스 (대상 서버) 의 호스트 항목을 추가해야 합니다.

문제가 해결되지 않으면 MSDTC 설정을 활성화 한 후 시도해보십시오.


1

저에게는 방화벽 설정과 관련이 있습니다. 방화벽 설정으로 이동하여 DTC 서비스를 허용하면 작동합니다.여기에 이미지 설명 입력


0

MSDTC에 대한 나의 마지막 모험과이 오류는 오늘 DNS 문제로 판명되었습니다. 머신이 동일한 도메인 인 EBarr에 있는지 묻는 올바른 길을 가고 있습니다. 그런데이 문제에 대한 멋진 목록입니다!

내 상황 : 방화벽을 통해 부모 도메인의 서버에 대해 분산 트랜잭션을 실행할 수 있도록 자식 도메인의 서버가 필요했습니다. 나는 수년 동안 연결된 서버를 꽤 많이 사용해 왔기 때문에 연결된 서버와 MSDTC에 대한 SQL의 모든 일반적인 설정을 Ian이 위에서 잘 문서화했습니다. 두 서버 모두에서 사용할 TCP 포트 (5000-5200) 범위로 MSDTC를 설정하고 포트 1433 및 5000-5200에 대한 상자 사이에 방화벽 구멍을 마련했습니다. 효과가 있었어야했다. 연결된 서버는 정상적으로 테스트되었고 연결된 서버를 통해 원격 SQL 서버를 잘 쿼리 할 수 ​​있었지만 분산 트랜잭션을 허용 할 수 없었습니다. DEV 서버에서 QA 서버의 연결을 볼 수도 있었지만 무언가가 돌아 오지 못했습니다.

다음과 같은 FQDN을 사용하여 QA에서 DEV 서버를 PING 할 수 있습니다. PING DEVSQL.dev.domain.com

시스템 이름 만 사용하여 DEV 서버를 PING 할 수 없습니다. PING DEVSQL

DEVSQL 서버는 두 도메인의 구성원이어야했지만 이름이 부모 도메인의 DNS에서 확인되지 않았습니다. 부모 도메인의 DEVSQL에 대한 컴퓨터 계정에 문제가 발생했습니다. 부모 도메인의 DNS에 DEVSQL을 추가하고 원격 QA 서버에서 "PING DEVSQL"이 작동하면이 문제가 해결되었습니다.

이게 도움이 되길 바란다!


0

보안 설정 외에도 트랜잭션을 실행하려면 두 서버에서 일부 포트를 열어야했습니다. 포트 59640을 열어야했지만 다음 제안에 따라 포트 135를 열어야합니다. http://support.microsoft.com/kb/839279


0

동일한 오류가 발생했고 소스 서버에서 MSDTC를 올바르게 구성하여 아웃 바운드를 허용하고 Windows 방화벽을 통해 DTC를 허용하여 문제를 해결했습니다.

Distributed Transaction Coordinator, tick domain, private 및 public 옵션 허용

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.