如何重新生成或移动 MSDTC 安装以用于 SQL 故障转移群集

本文介绍如何重新生成损坏的 Microsoft 分布式事务处理协调器 (MSDTC) 安装,以便与故障转移群集SQL Server安装配合使用。

适用于:Windows Server 2019、Windows Server 2016、Windows Server 2012 R2
原始 KB 编号: 294209

摘要

以下博客详细介绍了自 Windows Server 2008 发布以来 MSDTC 行为的变化。

SQL 故障转移群集上的 MSDTC 建议

以下常见问题解答 (常见问题解答) 的目的是解决 MSDTC 在与SQL Server故障转移群集实例一起使用时的常见问题,以包括当前建议和最佳做法。

MSDTC 是一个事务管理器,它允许客户端应用程序在一个事务中包含多个不同的数据源,然后协调跨事务登记的所有服务器提交分布式事务。 这有助于确保在事务的每个部分都成功时提交事务,或者在事务过程的任何部分失败时回滚。

许多人问为什么在安装SQL Server之前需要安装 MSDTC。 不再需要执行此操作。 这是2005年SQL Server要求的一项要求。 该版本的SQL Server已结束其生命周期,因此结束了安装SQL Server的要求。

在 Windows 故障转移群集等高可用性环境中部署SQL Server时,有一些最佳做法可以使 MSDTC 服务行为更易于预测。

  • 当可用性组下出现跨数据库和/或 DTC 事务支持主题时,快速响应为 “不支持!”

  • 这是一个真正的陈述,谈话倾向于然后关注,但为什么? 事实上,某些 DBA 已测试这些事务类型的各种形式,但未遇到错误。

  • 问题是测试未完成,并且所需的两阶段提交活动可能会导致数据丢失或数据库在某些配置中未按预期恢复。 事实上,SQL Server测试人员在战略位置注入故障,以创建难以 (但并非不可能在生产服务器上创建) 的方案。 有关详细信息,请参阅 不支持:具有 TC/跨数据库事务的 AG

使用 Windows 2008 故障转移群集及更高版本时,无需群集 MSDTC 就可以使用 MSDTC 服务的功能,因为 MSDTC 是在 Windows 2008 中重新设计的。 与 Windows 2003 不同,如果安装 Windows 故障转移群集,则必须对 MSDTC 进行群集化。 使用 Windows 2008 时,情况不再如此,因为默认情况下,MSDTC 服务在本地运行,即使安装了故障转移群集也是如此。

如果SQL Server故障转移群集实例确实需要 MSDTC,并且确实需要 MSDTC 资源与 SQL Server 实例进行故障转移,我们建议在包含 SQL Server 实例的 FailoverCluster 角色中创建 MSDTC 资源,并使用:

  • SQL Server网络名称\客户端接入点
  • SQL Server 角色中的磁盘
  • 使用 SQL 虚拟服务器名称命名 MSDTC 资源。

使用 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 资源不接受提供的名称,则可以使用以下 PowerShell 更改名称,并将新的分布式事务处理协调器替换为 RealSqlVsName:

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

    如果仍然处于活动状态,则可以替换 $VSqlSrv RealSqlVsName。

  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
    

    如果仍然处于活动状态,则可以替换 $VSqlSrv RealSqlVsName。 使用 $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
    

    现在应看到一行受到影响,并且插入的记录不存在。

References

在 SQL Server 中使用分布式事务的建议 MSDTC 设置