SQL 장애 조치(failover) 클러스터에 사용할 MSDTC 설치를 다시 빌드하거나 이동하는 방법

이 문서에서는 장애 조치(failover) 클러스터형 SQL Server 설치에 사용하기 위해 손상된 MSDTC(Microsoft Distributed Transaction Coordinator) 설치를 다시 빌드하는 방법을 설명합니다.

적용 대상: Windows Server 2019, Windows Server 2016, Windows Server 2012 R2
원래 KB 번호: 294209

요약

다음 블로그에는 Windows Server 2008 릴리스 이후 MSDTC 동작의 변경 내용에 대한 자세한 정보가 있습니다.

SQL 장애 조치(failover) 클러스터에 대한 MSDTC 권장 사항

다음 FAQ(질문과 대답)의 목적은 현재 권장 사항 및 모범 사례를 포함하기 위해 SQL Server 장애 조치(failover) 클러스터형 인스턴스와 함께 사용할 때 MSDTC와 관련된 일반적인 질문을 해결하는 것입니다.

MSDTC는 클라이언트 애플리케이션이 여러 다른 데이터 원본을 하나의 트랜잭션에 포함하도록 허용한 다음 트랜잭션에 참여하는 모든 서버에서 분산 트랜잭션 커밋을 조정하는 트랜잭션 관리자입니다. 이렇게 하면 트랜잭션의 모든 부분이 성공하거나 트랜잭션 프로세스의 일부가 실패하는 경우 롤백되는 경우 트랜잭션이 커밋되도록 할 수 있습니다.

많은 사람들이 SQL Server 설치하기 전에 MSDTC를 설치해야 하는 이유를 묻습니다. 더 이상 이 작업을 수행할 필요가 없습니다. 2005년 SQL Server 요구 사항이었습니다. 해당 버전의 SQL Server 수명 주기가 종료되어 SQL Server 설치 요구 사항이 종료되었습니다.

Windows 장애 조치(failover) 클러스터링과 같은 고가용성 환경에서 SQL Server 배포할 때 MSDTC 서비스 동작을 보다 예측 가능하게 만들 수 있는 특정 모범 사례가 있습니다.

  • 데이터베이스 간 및/또는 DTC 트랜잭션 지원 항목이 가용성 그룹에서 나오는 경우 빠른 응답은 지원되지 않습니다!.

  • 이것은 진정한 진술이며 대화는 그 다음에 집중하는 경향이 있지만 그 이유는 무엇입니까? 실제로 일부 DBA는 이러한 트랜잭션 유형의 다양한 형식을 테스트했으며 오류가 발생하지 않았습니다.

  • 문제는 테스트가 완료되지 않았고 필요한 2단계 커밋 작업으로 인해 데이터가 손실되거나 특정 구성에서 예상대로 복구되지 않는 데이터베이스가 발생할 수 있다는 것입니다. 실제로 SQL Server 테스터는 전략적 위치에 오류를 주입하여 프로덕션 서버에서 만들기가 어렵지만 불가능하지는 않은 시나리오를 만듭니다. 자세한 내용은 지원되지 않음: TC/데이터베이스 간 트랜잭션을 사용하는 AG를 참조하세요.

Windows 2008 장애 조치(failover) 클러스터 이상에서는 MSDTC가 Windows 2008에서 다시 설계되었기 때문에 MSDTC 서비스의 기능을 사용하기 위해 MSDTC를 클러스터할 필요가 없습니다. Windows 2003과 달리 Windows 장애 조치(failover) 클러스터를 설치하는 경우 MSDTC를 클러스터해야 했습니다. 기본적으로 MSDTC 서비스는 장애 조치(failover) 클러스터링이 설치된 상태에서도 로컬로 실행되므로 Windows 2008을 사용할 때는 더 이상 그렇지 않습니다.

SQL Server 장애 조치(failover) 클러스터형 인스턴스에 MSDTC가 필요하고 msDTC 리소스가 SQL Server 인스턴스로 장애 조치(failover)해야 하는 경우 SQL Server instance 포함하고 사용하는 FailoverCluster 역할 내에 MSDTC 리소스를 만드는 것이 좋습니다.

  • SQL Server 네트워크 이름\클라이언트 액세스 지점
  • SQL Server 역할 내의 디스크
  • MSDTC 리소스의 이름을 SQL 가상 서버 이름으로 지정합니다.

PowerShell을 사용하여 새 MSDTC 클러스터 리소스 설정 및 테스트

  1. 아래 섹션을 포함하여 사이의 콘텐츠를 대체하는 새 MSDTC 리소스를 <> 만든 다음 실행합니다.

    $SqlRole = <Actual name of the role containing the SQL Server instance>
    $SqlNetName = <Actual SQL Servernetwork resourcename>
    $VSqlSrv = <Actual SQL Server virtual server name>
    $CluDsk = <Actual disk resource name>
    

    MSDTC 리소스가 제공된 이름을 수락하지 않은 경우 새 분산 트랜잭션 코디네이터를 RealSqlVsName으로 바꾸는 다음 PowerShell을 사용하여 이름을 변경할 수 있습니다.

    Get-ClusterResource "New Distributed Transaction Coordinator" | %{$_.Name = RealSqlVsName }
    

    여전히 활성 상태인 경우 RealSqlVsName을 대체할 $VSqlSrv 수 있습니다.

  2. 다음 스크립트를 사용하여 방화벽 규칙을 확인합니다.

    Set-NetFirewallRule -Name 'RPC Endpoint Mapper' -Enabled True
    Set-NetFirewallRule -Name 'DTC incoming connections' -Enabled True
    Set-NetFirewallRule -Name 'DTC outgoing connections' -Enabled True
    
  3. 다음 스크립트를 사용하여 MSDTC 네트워크 인증을 설정합니다.

    Set-DtcNetworkSetting -AuthenticationLevel Mutual `
    -DtcName "Local" -InboundTransactionsEnabled $True `
    -LUTransactionsEnabled $True `
    -OutboundTransactionsEnabled $True `
    -RemoteAdministrationAccessEnabled $False `
    -RemoteClientAccessEnabled $False `
    -XATransactionsEnabled $True -verbose
    
  4. 이제 다음 명령을 사용하여 새 MSDTC 리소스가 나열되는지 확인합니다.

    Get-Dtc -Verbose |Sort-Object DtcName
    
  5. 새 MSDTC 리소스를 테스트합니다.

    Test-Dtc -LocalComputerName RealSqlVsName -Verbose
    

    여전히 활성 상태인 경우 RealSqlVsName을 대체할 $VSqlSrv 수 있습니다. 를 사용하여 $Env:COMPUTERNAME 로컬 설치를 테스트합니다. 다른 모든 기존 클러스터 노드에서 방화벽 규칙 및 MSDTC 인증 PowerShell 명령을 실행해야 합니다.

  6. MSDTC를 테스트합니다.

    이 예제에서는 AdventureWorks2012 데이터베이스를 사용합니다. 테스트하려는 실제 데이터베이스 이름을 대체해야 합니다. SQL Server 쿼리 창에서 다음 SQL 문을 실행합니다.

    USE AdventureWorks2012;
    
    GO
    
    BEGIN DISTRIBUTED TRANSACTION; 
    
    -- Enter fake transaction to the database
    
    INSERT SQL_Statement
    
    DELETE SQL_Statement
    
    COMMIT TRANSACTION
    
    GO
    

    이제 한 행이 영향을 받고 삽입된 레코드가 존재하지 않는 것을 볼 수 있습니다.

참조

SQL Server 분산 트랜잭션을 사용하기 위한 권장 MSDTC 설정