Cómo recompilar o mover una instalación de MSDTC para su uso con un clúster de conmutación por error de SQL

En este artículo se describe cómo recompilar una instalación rota del Coordinador de transacciones distribuidas de Microsoft (MSDTC) para usarla con una instalación de SQL Server agrupada en clústeres de conmutación por error.

Se aplica a: Windows Server 2019, Windows Server 2016, Windows Server 2012 R2
Número de KB original: 294209

Resumen

El blog siguiente tiene información detallada sobre los cambios en el comportamiento de MSDTC desde el lanzamiento de Windows Server 2008.

Recomendaciones de MSDTC en el clúster de conmutación por error de SQL

El propósito de las siguientes preguntas más frecuentes es abordar preguntas comunes con MSDTC cuando se usan con SQL Server instancias agrupadas en clústeres de conmutación por error para incluir recomendaciones y procedimientos recomendados actuales.

MSDTC es un administrador de transacciones que permite a las aplicaciones cliente incluir varios orígenes de datos diferentes en una transacción y que, a continuación, coordina la confirmación de la transacción distribuida en todos los servidores que están inscritos en la transacción. Esto ayuda a garantizar que la transacción se confirme, si cada parte de la transacción se realiza correctamente o si se revierte, si se produce un error en alguna parte del proceso de transacción.

Muchas personas preguntan por qué necesitamos instalar MSDTC antes de instalar SQL Server. Ya no es necesario realizar esta operación. Era un requisito que SQL Server 2005 había requerido. Esa versión de SQL Server ha terminado su ciclo de vida y, por tanto, ha finalizado el requisito de instalar SQL Server.

Al implementar SQL Server en un entorno de alta disponibilidad como clústeres de conmutación por error de Windows, hay ciertos procedimientos recomendados que pueden hacer que el comportamiento de los servicios MSDTC sea más predecible.

  • Cuando el tema de la compatibilidad con transacciones entre bases de datos o DTC, en un grupo de disponibilidad, aparece la respuesta rápida NO es COMPATIBLE.

  • Esta es una afirmación verdadera y la conversación tiende a centrarse en, ¿pero por qué? De hecho, algunos DBA han probado varias formas de estos tipos de transacción y no han encontrado errores.

  • El problema es que las pruebas no están completas y la actividad de confirmación en dos fases necesaria puede dar lugar a la pérdida de datos o a una base de datos que no se recupera según lo esperado en determinadas configuraciones. De hecho, los evaluadores de SQL Server insertan errores en ubicaciones estratégicas para crear escenarios difíciles (pero no imposibles) de crear en un servidor de producción. Para obtener más información, vea Not-Supported: AG with TC/Cross-Database Transaction.

Con el clúster de conmutación por error de Windows 2008 y versiones posteriores, no es necesario agrupar MSDTC para usar la funcionalidad del servicio MSDTC porque MSDTC se ha vuelto a diseñar en Windows 2008. A diferencia de Windows 2003, si instala el clúster de conmutación por error de Windows, tenía que agrupar MSDTC. Este ya no es el caso cuando se usa Windows 2008, ya que de forma predeterminada el servicio MSDTC se ejecuta localmente, incluso con clústeres de conmutación por error instalados.

Si la instancia en clúster de conmutación por error de SQL Server requiere MSDTC y requiere que los recursos de MSDTC realicen la conmutación por error con la instancia de SQL Server, se recomienda crear un recurso MSDTC dentro del rol FailoverCluster que contenga la instancia de SQL Server y que use:

  • El SQL Server nombre de red\punto de acceso de cliente
  • Un disco dentro del rol SQL Server
  • Asigne al recurso MSDTC el nombre del servidor virtual de SQL.

Instalación y prueba de un nuevo recurso de clúster de MSDTC mediante PowerShell

  1. Cree un nuevo recurso MSDTC reemplazando el contenido entre e incluyendo las <> secciones siguientes y, a continuación, ejecute.

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

    Si el recurso MSDTC no aceptó el nombre proporcionado, puede modificar el nombre mediante el siguiente PowerShell reemplazando el nuevo coordinador de transacciones distribuidas por RealSqlVsName:

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

    Puede sustituir $VSqlSrv RealSqlVsName si sigue activo.

  2. Compruebe las reglas de firewall mediante el siguiente 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. Establezca la autenticación de red MSDTC mediante el siguiente script:

    Set-DtcNetworkSetting -AuthenticationLevel Mutual `
    -DtcName "Local" -InboundTransactionsEnabled $True `
    -LUTransactionsEnabled $True `
    -OutboundTransactionsEnabled $True `
    -RemoteAdministrationAccessEnabled $False `
    -RemoteClientAccessEnabled $False `
    -XATransactionsEnabled $True -verbose
    
  4. Compruebe que el nuevo recurso MSDTC aparece ahora mediante el siguiente comando:

    Get-Dtc -Verbose |Sort-Object DtcName
    
  5. Pruebe el nuevo recurso MSDTC.

    Test-Dtc -LocalComputerName RealSqlVsName -Verbose
    

    Puede sustituir $VSqlSrv RealSqlVsName si sigue activo. Use $Env:COMPUTERNAME para probar la instalación local. Tendrá que ejecutar las reglas de firewall y los comandos de PowerShell de autenticación de MSDTC en todos los demás nodos de clúster existentes.

  6. Pruebe MSDTC.

    En este ejemplo, usaremos la base de datos AdventureWorks2012, y tendrá que sustituir un nombre de base de datos real con el que desea probar. Desde una ventana de consulta SQL Server, ejecute la siguiente instrucción SQL:

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

    Ahora debería ver que una fila se ve afectada y que el registro insertado no existe.

Referencias

Configuración recomendada de MSDTC para usar transacciones distribuidas en SQL Server