本文介绍如何重新生成中断的Microsoft分布式事务处理协调器(MSDTC)安装,以便与故障转移群集 SQL Server 安装配合使用。
原始 KB 数: 294209
总结
自 Windows Server 2008 发布以来,以下博客详细介绍了 MSDTC 行为的变化。
以下常见问题(常见问题解答)的目的是在与 SQL Server 故障转移群集实例一起使用时解决 MSDTC 的常见问题,以包括当前建议和最佳做法。
MSDTC 是一个事务管理器,允许客户端应用程序在一个事务中包含多个不同的数据源,然后协调跨事务中登记的所有服务器提交分布式事务。 这有助于确保在事务的每个部分都成功或回滚事务进程的任何部分失败时提交事务。
许多人询问为什么在安装 SQL Server 之前需要安装 MSDTC。 不再需要执行此操作。 这是 SQL Server 2005 所需的要求。 该版本的 SQL Server 已结束其生命周期,因此结束了安装 SQL Server 的要求。
在 Windows 故障转移群集等高可用性环境中部署 SQL Server 时,某些最佳做法可以使 MSDTC 服务行为更具可预测性。
- 当跨数据库和/或 DTC 事务支持的主题位于可用性组下时,快速响应不受 支持!。
- 这是一个真正的陈述,谈话往往关注,但为什么? 事实上,某些 DBA 已经测试了各种形式的这些事务类型,并且未遇到错误。
- 问题是测试未完成,并且所需的两阶段提交活动可能会导致数据丢失或某些配置中未按预期恢复的数据库。 事实上,SQL Server 测试人员在战略位置注入故障,以创建在生产服务器上难以(但并非不可能)创建的方案。 有关详细信息,请参阅 “不支持:具有 TC/跨数据库事务的 AG”。
借助 Windows 2008 故障转移群集及更高版本,无需群集 MSDTC 才能使用 MSDTC 服务的功能,因为 MSDTC 在 Windows 2008 中重新设计了 MSDTC。 与 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 群集资源
-
创建一个新的 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> Add-ClusterResource -Name $VSqlSrv -ResourceType "Distributed Transaction Coordinator" -Group $SqlRole如果 MSDTC 资源不接受提供的名称,则可以使用以下 PowerShell 更改名称,将新的分布式事务处理协调器替换为 RealSqlVsName:
Get-ClusterResource "New Distributed Transaction Coordinator" | %{$_.Name = RealSqlVsName }如果仍然处于活动状态,则可以替换
$VSqlSrvRealSqlVsName。 -
使用以下脚本验证防火墙规则:
Set-NetFirewallRule -Name 'RPC Endpoint Mapper' -Enabled True Set-NetFirewallRule -Name 'DTC incoming connections' -Enabled True Set-NetFirewallRule -Name 'DTC outgoing connections' -Enabled True -
使用以下脚本设置 MSDTC 网络身份验证:
Set-DtcNetworkSetting -AuthenticationLevel Mutual ` -DtcName "Local" -InboundTransactionsEnabled $True ` -LUTransactionsEnabled $True ` -OutboundTransactionsEnabled $True ` -RemoteAdministrationAccessEnabled $False ` -RemoteClientAccessEnabled $False ` -XATransactionsEnabled $True -verbose -
使用以下命令验证现在是否列出了新的 MSDTC 资源:
Get-Dtc -Verbose |Sort-Object DtcName -
测试新的 MSDTC 资源。
Test-Dtc -LocalComputerName RealSqlVsName -Verbose如果仍然处于活动状态,则可以替换
$VSqlSrvRealSqlVsName。 用于$Env:COMPUTERNAME测试本地安装。 需要在所有其他现有群集节点上执行防火墙规则和 MSDTC 身份验证 PowerShell 命令。 -
测试 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现在应会看到一行受到影响,并且插入的记录不存在。