Cómo volver a crear o mover una instalación de MSDTC para usarla con un clúster de conmutación por error de SQL

Se aplica a: Windows Server 2019, all editionsSQL Server 2008 R2 WorkgroupSQL Server 2008 R2 Developer

Resumen


En este artículo se describe cómo volver a crear una instalación de Coordinador de transacciones distribuidas de Microsoft (MSDTC) con conmutación por error de instalación de SQL Server. En el siguiente blog se ofrece información detallada sobre los cambios en el comportamiento de MSDTC desde la versión de Windows 2008.
  • Recomendaciones de MSDTC en el clúster de conmutación por error de SQL El propósito de las preguntas más frecuentes (preguntas más frecuentes) es resolver las preguntas más frecuentes con MSDTC (Coordinador de transacciones distribuidas de Microsoft) cuando se usa con las instancias agrupadas con conmutación por error de SQL Server para incluir recomendaciones y procedimientos recomendados actuales.

Introducción


El Coordinador de transacciones distribuidas de Microsoft (MSDTC) es un administrador de transacciones que permite a las aplicaciones cliente incluir varios orígenes de datos diferentes en una misma transacción y que, a continuación, coordina la confirmación de la transacción distribuida en todos los servidores que están inlistados en la transacción. Esto ayuda a garantizar que la transacción se confirma, si cada parte de la transacción se ejecuta correctamente, o se deshace, si se produce un error en cualquier parte del proceso de transacción.
Una gran cantidad de personas preguntan por qué necesitamos instalar MSDTC antes de instalar SQL Server, ya que ya no es necesario que esto fuera un requisito de que SQL Server 2005 fuera necesario. Esa versión de SQL Server ha finalizado su ciclo de vida y así ha finalizado el requisito de realizar la instalación de SQL Server.
Al implementar SQL Server en un entorno de alta disponibilidad como clúster de conmutación por error de Windows, hay algunos procedimientos recomendados que pueden hacer que el comportamiento de los servicios de MSDTC sea más predecible.
  • Cuando se encuentra en el tema de compatibilidad con las transacciones entre bases de datos y/o DTC, en un grupo de disponibilidad, no se admite la respuesta rápida.
  • Esta es una afirmación auténtica, y la conversación tiende a centrarse en ¿por qué? De hecho, algunos DBA han probado varias formas de estos tipos de transacción y no se han encontrado errores.
  • El problema es que las pruebas no se completan y la actividad de confirmación en dos fases puede dar lugar a la pérdida de datos o a una base de datos que no se recupere de la forma esperada en determinadas configuraciones. De hecho, los evaluadores de SQL Server introducen errores en ubicaciones estratégicas para crear los escenarios que son difíciles (pero no imposibles) de crear en un servidor de producción.
Para obtener más información, vea no compatible: AGS con TC/transacciones entre bases de datos.
Con el clúster de conmutación por error de Windows 2008 y versiones posteriores, no necesita agrupar MSDTC para usar la funcionalidad del servicio MSDTC. Esto se debe a que MSDTC se rediseñó en Windows 2008 y, a diferencia de Windows 2003, si se instaló el clúster de conmutación por error de Windows, tenía que agrupar MSDTC. Esto ya no es así cuando se usa Windows 2008, ya que el servicio MSDTC está ejecutándose de forma local, incluso con el clúster de conmutación por error instalado.
Si la instancia agrupada de conmutación por error de SQL Server requiere MSDTC y necesita que el resoruces de MSDTC realice la conmutación por error con la instancia de SQL Server, se recomienda crear un recurso MSDTC dentro del rol FailoverCluster que contiene la instancia de SQL Server y que usa:
  • El punto de acceso \client de nombre de red de SQL Server
  • Un disco dentro del rol de SQL Server
  • El recurso MSDTC debe tener el nombre del servidor virtual SQL.

Más información


Cómo configurar y probar un nuevo recurso de clúster de MSDTC con PowerShell

# Create a new MSDTC resource replacing the content between and including the <> sections below then 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>
# NOTE: If the MSDTC resource did not accept the name provided you can alter the name using the following Powershell replacing the New Distributed Transaction Coordinator with RealSqlVsName: Get-ClusterResource "New Distributed Transaction Coordinator" | %{$_.Name = RealSqlVsName } # $VSqlSrv can be substituted for RealSqlVsName if still active# Script to verify firewall rulesSet-NetFirewallRule -Name 'RPC Endpoint Mapper' -Enabled TrueSet-NetFirewallRule -Name 'DTC incoming connections' -Enabled TrueSet-NetFirewallRule -Name 'DTC outgoing connections' -Enabled True # Setting the MSDTC network authenticationSet-DtcNetworkSetting -AuthenticationLevel Mutual; -DtcName "Local" -InboundTransactionsEnabled $True; -LUTransactionsEnabled $True; -OutboundTransactionsEnabled $True; -RemoteAdministrationAccessEnabled $False; -RemoteClientAccessEnabled $False; -XATransactionsEnabled $True -verbose# Verify the new MSDTC resoruce is now listedGet-Dtc -Verbose |Sort-Object DtcName # Test the new MSDTC resourceTest-Dtc -LocalComputerName RealSqlVsName -Verbose # $VSqlSrv can be substituted for RealSqlVsName if still active, Use $Env:COMPUTERNAME to test the local installation. 
Las reglas de firewall y los comandos de PowerShell de autenticación de MSDTC tendrán que ejecutarse en todos los demás nodos de clúster existentes.

Probar MSDTC

En este ejemplo, usaremos la base de datos AdventureWorks2012, debe sustituir el nombre de la base de datos real por el que quiera probar.
Desde una ventana de consulta de SQL Server, ejecute la siguiente instrucción SQL:
USE AdventureWorks2012;GOBEGIN DISTRIBUTED TRANSACTION; -- Enter fake trans action to the databaseINSERT SQL_StatementDELETE SQL_StatementCOMMIT TRANSACTIONGO
Ahora debería ver que una fila se ha visto afectada y que el registro insertado no existe.