如何重建或移動 MSDTC 安裝以搭配 SQL 故障轉移叢集使用

本文說明如何重建中斷的 Microsoft 分散式交易協調器 (MSDTC) 安裝,以便與故障轉移叢集 SQL Server 安裝搭配使用。

適用於: Windows Server 2019、Windows Server 2016、Windows Server 2012 R2
原始 KB 編號: 294209

摘要

下列部落格提供自 Windows Server 2008 發行後 MSDTC 行為變更的詳細資訊。

SQL 故障轉移叢集上的 MSDTC 建議

下列常見問題 (常見問題) 的目的是在搭配 SQL Server 故障轉移叢集實例使用時,解決 MSDTC 的常見問題,以包含目前的建議和最佳做法。

MSDTC 是一個交易管理員,可讓用戶端應用程式在一個交易中包含數個不同的數據源,然後協調在交易中登記的所有伺服器上認可分散式交易。 這有助於確保交易在交易的每個部分都成功時認可,或在交易程式的任何部分失敗時復原。

許多人會詢問為什麼我們需要先安裝 MSDTC,再安裝 SQL Server。 您不再需要執行這項作業。 這是 SQL Server 2005 的需求。 該版本的 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
    

    您現在應該會看到一個數據列受到影響,而且插入的記錄不存在。

參考資料

在 SQL Server 中使用分散式交易的建議 MSDTC 設定