Como reconstruir ou mover uma instalação do MSDTC para uso com um cluster de failover do SQL

Este artigo descreve como reconstruir uma instalação do MSDTC (Coordenador de Transações Distribuídas) quebrada da Microsoft para uso com um failover clusterizado SQL Server instalação.

Aplica-se a: Windows Server 2019, Windows Server 2016, Windows Server 2012 R2
Número de KB original: 294209

Resumo

O blog a seguir tem informações detalhadas sobre as alterações no comportamento do MSDTC desde o lançamento do Windows Server 2008.

Recomendações do MSDTC no Cluster de Failover do SQL

A finalidade das perguntas frequentes a seguir é abordar perguntas comuns com MSDTC quando usadas com SQL Server instâncias clusteradas de Failover para incluir recomendações atuais e práticas recomendadas.

O MSDTC é um gerenciador de transações que permite que os aplicativos cliente incluam várias fontes de dados diferentes em uma transação e que coordena a confirmação da transação distribuída em todos os servidores que são alistados na transação. Isso ajuda a garantir que a transação seja confirmada, se cada parte da transação for bem-sucedida ou for revertida, se alguma parte do processo de transação falhar.

Muitas pessoas perguntam por que precisamos instalar o MSDTC antes de instalar SQL Server. Você não precisa mais fazer essa operação. Era um requisito que SQL Server 2005 tinha exigido. Essa versão do SQL Server encerrou seu ciclo de vida e, portanto, acabou com o requisito de instalar SQL Server.

Ao implantar SQL Server em um ambiente altamente disponível, como o Clustering de Failover do Windows, há certas práticas recomendadas que podem tornar o comportamento dos serviços MSDTC mais previsível.

  • Quando o tópico de suporte a transações entre bancos de dados e/ou DTC, em um Grupo de Disponibilidade, aparece a resposta rápida NÃO tem SUPORTE!.

  • Esta é uma declaração verdadeira e a conversa tende a se concentrar, mas por quê? Na verdade, alguns DBAs testaram várias formas desses tipos de transação e não encontraram erros.

  • O problema é que o teste não está concluído e a atividade de confirmação de duas fases necessária pode resultar em perda de dados ou um banco de dados que não se recupera conforme o esperado em determinadas configurações. De fato, os testadores SQL Server injetam falhas em locais estratégicos para criar cenários difíceis (mas não impossíveis) de criar em um servidor de produção. Para obter mais informações, consulte Sem suporte: AGs com transação TC/Banco de Dados Cruzado.

Com o cluster failover do Windows 2008 e posteriores, você não precisa agrupar o MSDTC para usar a funcionalidade do serviço MSDTC porque o MSDTC foi redesenhado no Windows 2008. Ao contrário do Windows 2003, se você instalar o Cluster de Failover do Windows, precisará clusterar o MSDTC. Esse não é mais o caso ao usar o Windows 2008, já que por padrão o serviço MSDTC está sendo executado localmente, mesmo com o Clustering de Failover instalado.

Se sua instância clusterada de failover SQL Server exigir MSDTC e exigir que os recursos MSDTC falhem com a Instância SQL Server, recomendamos criar um recurso MSDTC dentro da função FailoverCluster que contém a instância SQL Server e que ela use:

  • O SQL Server nome da rede\ponto de acesso ao cliente
  • Um disco dentro da função SQL Server
  • Nomeie o recurso MSDTC com o nome do servidor virtual SQL.

Configurar e testar um novo recurso de cluster MSDTC usando o PowerShell

  1. Crie um novo recurso MSDTC substituindo o conteúdo entre e incluindo as <> seções abaixo e execute.

    $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>
    

    Se o recurso MSDTC não aceitou o nome fornecido, você poderá alterar o nome usando o seguinte PowerShell substituindo o Novo Coordenador de Transações Distribuídas por RealSqlVsName:

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

    Você pode substituir $VSqlSrv o RealSqlVsName se ainda estiver ativo.

  2. Verifique as regras de firewall usando o seguinte script:

    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. Defina a autenticação de rede MSDTC usando o seguinte script:

    Set-DtcNetworkSetting -AuthenticationLevel Mutual `
    -DtcName "Local" -InboundTransactionsEnabled $True `
    -LUTransactionsEnabled $True `
    -OutboundTransactionsEnabled $True `
    -RemoteAdministrationAccessEnabled $False `
    -RemoteClientAccessEnabled $False `
    -XATransactionsEnabled $True -verbose
    
  4. Verifique se o novo recurso MSDTC agora está listado usando o seguinte comando:

    Get-Dtc -Verbose |Sort-Object DtcName
    
  5. Teste o novo recurso MSDTC.

    Test-Dtc -LocalComputerName RealSqlVsName -Verbose
    

    Você pode substituir $VSqlSrv o RealSqlVsName se ainda estiver ativo. Use $Env:COMPUTERNAME para testar a instalação local. Você precisará executar as regras de firewall e os comandos do PowerShell de autenticação MSDTC em todos os outros nós de cluster existentes.

  6. Teste MSDTC.

    Neste exemplo, usaremos o banco de dados AdventureWorks2012, você precisa substituir um nome de banco de dados real no qual deseja testar. Em uma janela de consulta SQL Server, execute a seguinte instrução SQL:

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

    Agora você deve ver que uma linha foi afetada e que o registro inserido não existe.

Referências

Configurações recomendadas do MSDTC para usar transações distribuídas em SQL Server