itsource

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

mycopycode 2023. 4. 27. 22:23
반응형

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

연결된 서버에 대해 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 Server가 서로 통신하도록 하려면 어떻게 해야 합니까?

관련 질문


가 한 일은 상관없지만, 어쨌든 올리겠습니다.

  1. 확신해주다Distributed Transaction Coordinator 시스템되고 있습니다.

    여기에 이미지 설명 입력

    여기에 이미지 설명 입력

  2. 두 시스템 모두에서 모든 MSDTC 보안을 비활성화합니다.

    여기에 이미지 설명 입력

    여기에 이미지 설명 입력

  3. 연결된 서버에서 임의 옵션 켜기:

여기에 이미지 설명 입력

  1. 저주와 저주.

  2. 부서진 것들.

  3. 되었습니다.SELECT연결된 서버를 사용할 수 있습니다.

        SELECT * FROM ASILive.CustomerManagementSystem.dbo.Users
        ....
    
        (763 row(s) affected)
    
  4. 클라이언트 서버가 원격 서버에서 다음 작업을 수행할 수 있는지 확인합니다.

         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. 두 서버의 서버 이름과 일치하는 항목을 선택했습니다.

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

    그리고.

       SELECT @@SERVERNAME, SERVERPROPERTY('MachineName')
    
       ----------  ----------
       ASIGROBTEST  ASIGROBTEST
    
  7. 비명을 질렀습니다.

  8. 쿼리를 실행하기 전에 실행됨:

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

    HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer
    

    두 서버 모두에서.

원격 서버의 MSDTC가 로컬 서버의 복제본이었습니다.

윈도우즈 응용 프로그램 이벤트 로그에서 다음을 수행합니다.

유형:(Error): 오류(Error)
소스: MSDTC : MSDTC
카테고리: CM 진행자: CM
ID: ~ 4101
날짜: 2011년 9월 19일
: : 오후 1시 32분 59초
사용자: 해당 없음
ASITESTSERVER : ASITESTSERVER
설명:

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

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

입니다.

msdtc -uninstall
msdtc -install

SQL Server 서비스를 중지하고 다시 시작하면 문제가 해결됩니다.

에 대한 , "RPC"로 를하여 이 에 언급된 문제할 수 .False):

여기에 이미지 설명 입력

@WonderWorker의 요청에 따라 SQL 스크립트를 통해 다음 작업을 수행할 수 있습니다.

EXEC master.dbo.sp_serveroption
     @server = N'[mylinkedserver]',
     @optname = N'remote proc transaction promotion',
     @optvalue = N'false'

서비스가 시작되면 서비스 사이에 이더넷 경로가 있고 이름 확인 작업, 연결된 서버 작업 및 트랜잭션 인증을 해제합니다.

내 직감은 방화벽 문제라고 하지만 몇 가지 생각나는 것들이 있습니다.

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

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

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

MSDTC에 대한 저의 마지막 모험과 오늘의 이 오류는 DNS 문제로 밝혀졌습니다.당신은 기계가 같은 도메인에 있는지 묻는 것이 옳은 길입니다, EBar.그나저나, 이 문제에 대한 훌륭한 목록입니다!

내 상황:방화벽을 통해 상위 도메인의 서버에 대해 분산 트랜잭션을 실행할 수 있는 하위 도메인의 서버가 필요했습니다.저는 몇 년 동안 링크된 서버를 꽤 많이 사용했기 때문에 링크된 서버에 대한 SQL과 Ian이 위에서 아주 멋지게 문서화한 MSDTC의 일반적인 설정을 모두 가지고 있었습니다.두 서버 모두에서 사용할 수 있는 TCP 포트 범위(5000-5200)로 MSDTC를 설정하고 포트 1433과 5000-5200의 박스 사이에 방화벽 구멍을 마련했습니다.효과가 있었어야 했어요.링크된 서버는 정상적으로 테스트되었으며 링크된 서버를 통해 원격 SQL 서버를 올바르게 쿼리할 수 있었지만 분산 트랜잭션을 허용할 수 없었습니다.QA 서버에서 DEV 서버로 연결된 것까지 볼 수 있었지만, 무언가가 여행을 되돌리지 못했습니다.

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

시스템 이름 PING DEVSQL만으로 DEV 서버에 PING을 수행할 수 없습니다.

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

이것이 도움이 되길 바랍니다!

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

문제가 해결되지 않으면 MSDTC 설정을 활성화한 후 이 설정을 사용하십시오.

보안 설정 외에도 트랜잭션을 실행하기 위해 두 서버 모두에서 일부 포트를 열어야 했습니다.59640 포트를 열어야 했는데 아래 제안에 따르면 135 포트가 열려 있어야 합니다.http://support.microsoft.com/kb/839279

동일한 오류가 발생하여 소스 서버에서 MSDTC를 올바르게 구성하여 아웃바운드를 허용하고 DTC가 Windows 방화벽을 통과하도록 허용함으로써 문제를 해결할 수 있었습니다.

분산 트랜잭션 조정자, 체크 표시 도메인, 개인 및 공용 옵션 허용

DTC를 허용하기 위한 방화벽 설정은 도메인뿐만 아니라 개인 및 공용도 마찬가지입니다.도메인만으로는 충분하지 않습니다(그럴 것처럼 느껴지지만 그렇지 않습니다)

언급URL : https://stackoverflow.com/questions/7473508/unable-to-begin-a-distributed-transaction

반응형