Come ricompilare o spostare un'installazione MSDTC da usare con un cluster di failover SQL

Questo articolo descrive come ricompilare un'installazione di Microsoft Distributed Transaction Coordinator (MSDTC) interrotta per l'uso con un'installazione cluster di failover SQL Server.

Si applica a: Windows Server 2019, Windows Server 2016, Windows Server 2012 R2
Numero KB originale: 294209

Riepilogo

Il blog seguente contiene informazioni dettagliate sulle modifiche apportate al comportamento MSDTC dalla versione di Windows Server 2008.

Raccomandazioni MSDTC nel cluster di failover SQL

Lo scopo delle domande frequenti seguenti è quello di rispondere alle domande comuni con MSDTC quando vengono usate con istanze cluster di failover SQL Server per includere le raccomandazioni e le procedure consigliate correnti.

MSDTC è un gestore delle transazioni che consente alle applicazioni client di includere diverse origini dati in una transazione e che quindi coordina il commit della transazione distribuita in tutti i server inclusi nella transazione. In questo modo si garantisce che venga eseguito il commit della transazione, se ogni parte della transazione ha esito positivo o viene eseguito il rollback, se una parte del processo di transazione ha esito negativo.

Molte persone chiedono perché è necessario installare MSDTC prima di installare SQL Server. Non è più necessario eseguire questa operazione. Era un requisito necessario SQL Server 2005. Tale versione di SQL Server ha terminato il ciclo di vita e quindi ha terminato il requisito di installare SQL Server.

Quando si distribuiscono SQL Server in un ambiente a disponibilità elevata, ad esempio Clustering di failover di Windows, esistono alcune procedure consigliate che possono rendere il comportamento dei servizi MSDTC più prevedibile.

  • Quando l'argomento relativo al supporto delle transazioni tra database e/o DTC, in un gruppo di disponibilità, viene visualizzata la risposta rapida NON è SUPPORTATA!.

  • Questa è una vera affermazione e la conversazione tende a concentrarsi su, ma perché? In effetti, alcuni database hanno testato varie forme di questi tipi di transazione e non hanno riscontrato errori.

  • Il problema è che il test non è completato e l'attività di commit in due fasi richiesta può comportare la perdita di dati o un database che non viene ripristinato come previsto in determinate configurazioni. In effetti, i tester SQL Server inseriscono errori in posizioni strategiche per creare scenari difficili (ma non impossibili) da creare in un server di produzione. Per altre informazioni, vedere Not-Supported: AGs with TC/Cross-Database Transaction(Non supportato: gruppi di disponibilità con transazione tra database/TC).

Con il cluster di failover di Windows 2008 e versioni successive, non è necessario eseguire il cluster MSDTC per usare la funzionalità del servizio MSDTC perché MSDTC è stato riprogettò in Windows 2008. A differenza di Windows 2003, se si installa il cluster di failover di Windows, è necessario clusterizzare MSDTC. Questo non è più il caso quando si usa Windows 2008, perché per impostazione predefinita il servizio MSDTC è in esecuzione in locale, anche con Clustering di failover installato.

Se l'istanza cluster di failover di SQL Server richiede MSDTC e richiede il failover delle risorse MSDTC con l'istanza di SQL Server, è consigliabile creare una risorsa MSDTC all'interno del ruolo FailoverCluster che contiene l'istanza di SQL Server e che usa:

  • Il SQL Server nome di rete\punto di accesso client
  • Un disco all'interno del ruolo SQL Server
  • Assegnare alla risorsa MSDTC il nome del server virtuale SQL.

Configurare e testare una nuova risorsa cluster MSDTC usando PowerShell

  1. Creare una nuova risorsa MSDTC sostituendo il contenuto tra e includendo le <> sezioni seguenti, quindi eseguire.

    $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 la risorsa MSDTC non ha accettato il nome specificato, è possibile modificare il nome usando powershell seguente sostituendo New Distributed Transaction Coordinator con RealSqlVsName:

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

    È possibile sostituire $VSqlSrv RealSqlVsName se è ancora attivo.

  2. Verificare le regole del firewall usando lo script seguente:

    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. Impostare l'autenticazione di rete MSDTC usando lo script seguente:

    Set-DtcNetworkSetting -AuthenticationLevel Mutual `
    -DtcName "Local" -InboundTransactionsEnabled $True `
    -LUTransactionsEnabled $True `
    -OutboundTransactionsEnabled $True `
    -RemoteAdministrationAccessEnabled $False `
    -RemoteClientAccessEnabled $False `
    -XATransactionsEnabled $True -verbose
    
  4. Verificare che la nuova risorsa MSDTC sia ora elencata usando il comando seguente:

    Get-Dtc -Verbose |Sort-Object DtcName
    
  5. Testare la nuova risorsa MSDTC.

    Test-Dtc -LocalComputerName RealSqlVsName -Verbose
    

    È possibile sostituire $VSqlSrv RealSqlVsName se è ancora attivo. Usare $Env:COMPUTERNAME per testare l'installazione locale. Sarà necessario eseguire le regole del firewall e i comandi di PowerShell di autenticazione MSDTC in tutti gli altri nodi del cluster esistenti.

  6. Testare MSDTC.

    In questo esempio si userà il database AdventureWorks2012, è necessario sostituire un nome di database effettivo con cui si vuole eseguire il test. Da una finestra di query SQL Server eseguire l'istruzione SQL seguente:

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

    Si nota ora che una riga è interessata e che il record inserito non esiste.

Riferimenti

Impostazioni MSDTC consigliate per l'uso di transazioni distribuite in SQL Server