SQL フェールオーバー クラスターで使用するために MSDTC インストールを再構築または移動する方法

この記事では、フェールオーバー クラスター化されたSQL Serverインストールで使用するために、壊れた Microsoft 分散トランザクション コーディネーター (MSDTC) インストールを再構築する方法について説明します。

適用対象: Windows Server 2019、Windows Server 2016、Windows Server 2012 R2
元の KB 番号: 294209

概要

次のブログでは、Windows Server 2008 のリリース以降の MSDTC 動作の変更に関する詳細情報を示します。

SQL フェールオーバー クラスターに関する MSDTC の推奨事項

次のよく寄せられる質問 (FAQ) の目的は、SQL Serverフェールオーバー クラスターインスタンスで使用される場合に MSDTC で一般的な質問に対処し、現在の推奨事項とベスト プラクティスを含めることです。

MSDTC は、クライアント アプリケーションが複数の異なるデータ ソースを 1 つのトランザクションに含め、トランザクションに参加しているすべてのサーバー間で分散トランザクションのコミットを調整できるトランザクション マネージャーです。 これにより、トランザクションプロセスの一部が失敗した場合に、トランザクションのすべての部分が成功した場合、またはロールバックされた場合に、トランザクションが確実にコミットされます。

多くの人が、SQL Serverをインストールする前に MSDTC をインストールする必要がある理由を尋ねます。 この操作を行う必要はなくなりました。 これは、SQL Server 2005 が必要だった要件でした。 そのバージョンのSQL Serverはライフサイクルを終了したため、SQL Serverをインストールする要件が終了しました。

Windows フェールオーバー クラスタリングなどの高可用性環境にSQL Serverを展開する場合、MSDTC サービスの動作をより予測しやすくするための特定のベスト プラクティスがあります。

  • 可用性グループの下で、データベース間または DTC トランザクションサポートのトピックが表示された場合、クイック応答は サポートされていません!

  • これは真の言葉であり、会話は焦点を当てる傾向がありますが、なぜですか? 実際、一部の DBA では、これらのトランザクションの種類のさまざまな形式がテストされており、エラーが発生していません。

  • 問題は、テストが完了せず、必要な 2 フェーズ コミット アクティビティによってデータが失われたり、特定の構成で予期したとおりに回復しないデータベースが発生する可能性があるということです。 実際、SQL Serverテスト担当者は、運用サーバー上で作成するのが困難 (不可能ではない) シナリオを作成するために、戦略的な場所にエラーを挿入します。 詳細については、「 サポートされていない: TC/データベース間トランザクションを使用した AG」を参照してください。

Windows 2008 フェールオーバー クラスター以降では、MSDTC が Windows 2008 で再設計されたため、MSDTC サービスの機能を使用するために MSDTC をクラスター化する必要はありません。 Windows 2003 とは異なり、Windows フェールオーバー クラスターをインストールする場合は、MSDTC をクラスター化する必要がありました。 既定では、フェールオーバー クラスタリングがインストールされていても MSDTC サービスがローカルで実行されているため、Windows 2008 を使用する場合は、この問題はなくなりました。

SQL Server フェールオーバー クラスター化インスタンスで MSDTC が必要であり、MSDTC リソースをSQL Server インスタンスでフェールオーバーする必要がある場合は、SQL Server インスタンスを含む MSDTC リソースを FailoverCluster ロール内に作成し、それを使用することをお勧めします。

  • SQL Server ネットワーク名\クライアント アクセス ポイント
  • SQL Server ロール内のディスク
  • MSDTC リソースに SQL 仮想サーバー名の名前を付けます。

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 }
    

    まだアクティブな場合は、RealSqlVsName に置き換えることができます $VSqlSrv

  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
    

    まだアクティブな場合は、RealSqlVsName に置き換えることができます $VSqlSrv 。 を使用して $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
    

    これで、1 つの行が影響を受け、挿入されたレコードが存在しないことがわかります。

関連情報

SQL Serverで分散トランザクションを使用するための推奨 MSDTC 設定