Azure SQL Managed Instance 用の分散トランザクション コーディネーター (DTC)

適用対象:Azure SQL Managed Instance

この記事では、Azure SQL Managed Instance 用の分散トランザクション コーディネーター (DTC) の概要について説明します。 DTC を使用して、混合環境で分散トランザクションを実行します。たとえば、マネージド インスタンス、SQL Server インスタンス、その他のリレーショナル データベース管理システム (RDBMS)、カスタム アプリケーション、および Azure へのネットワーク接続を確立できる任意の環境でホストされているその他のトランザクション参加者の間で行われます。

Note

Azure SQL Managed Instance 用 DTC は、2022 年 11 月の機能ウェーブの一部です。 機能ウェーブのロールアウトのタイムラインについて詳しくは、2022 年 11 月の機能ウェーブに関する記事をご覧ください。

シナリオ

Azure SQL Managed Instance 用の DTC によって、Azure へのネットワーク接続を確立できるさまざまな環境間で分散トランザクションを実行できます。 SQL Managed Instance 用 DTC は "マネージド" です。つまり、Azure がログ、ストレージ、DTC の可用性、ネットワークなどの管理とメンテナンスを行います。 マネージドの側面とは別に、SQL Managed Instance 用の DTC は、SQL Server の従来の分散トランザクションをサポートする同じ DTC Windows サービスです。

SQL Managed Instance 用の DTC によって、XA、.NET、T-SQL、COM+、ODBC、JDBC など、さまざまなテクノロジとシナリオを活用できるようになります。

分散トランザクションを実行するには、次のタスクを実行します。

  1. DTC を構成する。
  2. 参加要素間のネットワーク接続を有効にする。
  3. DNS 設定を構成する。

Note

マネージド インスタンスによってのみホストされるデータベース間の T-SQL または .NET 分散トランザクションの場合は、分散トランザクションのネイティブ サポートを使うことをお勧めします。

要件

DTC の設定を変更するには、Microsoft.Sql/managedInstances/dtc リソースに対する書き込みアクセス許可が必要です。 DTC の設定を表示するには、Microsoft.Sql/managedInstances/dtc リソースに対する読み取りアクセス許可が必要です。


DTC を構成する

Azure portal、Azure PowerShell、CLI を使って DTC を構成できます。

Azure portal を使用して DTC を構成するには:

  1. Azure portal で、マネージド インスタンスに移動します。

  2. 左側のメニューの [設定] で、[分散トランザクション コーディネーター] を選択します。

    強調表示されているメニュー オプション、SQL Managed Instance の [分散トランザクション コーディネーター] ペイン、[基本] タブを示すスクリーンショット。

  3. [基本] タブで、[分散トランザクション コーディネーター][有効] に設定します。

  4. [セキュリティ] タブで、受信または送信トランザクションを許可し、XA または SNA LU を有効にします。

  5. [ネットワーク] タブで、DTC の DNS を指定し、外部 DNS とネットワークを構成するための情報を取得します。

ネットワーク接続

DTC を使用するには、すべてのトランザクション参加者が Azure へのネットワーク接続を持っている必要があります。 マネージド インスタンスは常に Azure の専用仮想ネットワークにデプロイされるため、外部環境をマネージド インスタンスの仮想ネットワークに接続する必要があります。 この文脈では、"外部" とはマネージド インスタンスではないオブジェクトやプロセスのことを指します。 外部リソースで Azure の仮想ネットワークも使用している場合は、仮想ネットワーク ピアリングを使用できます。 それ以外の場合は、任意の方法を使用して接続を確立します。たとえば、ポイント対サイト VPN、Azure ExpressRoute、またはビジネス ニーズを満たす別のネットワーク接続テクノロジなどです。

マネージド インスタンスの仮想ネットワーク ネットワーク セキュリティ グループおよび、外部環境でセットアップされたファイアウォールの両方で、ポート 135 は受信および送信両方、ポート範囲 14000-15000 は受信、49152-65535 は送信の通信を許可する必要があります。

DNS の設定

DTC は、双方向の通信のためにトランザクション参加者の NetBIOS 名に依存します。 NetBIOS プロトコルは Azure ネットワークではサポートされておらず、混合環境では NetBIOS 名を解決できないため、マネージド インスタンス用の DTC はホスト名解決のために DNS ネーム サーバーに依存します。 マネージド インスタンスの DTC ホストは、Azure DNS サーバーに自動的に登録されます。 外部 DTC ホストを DNS サーバーに登録する必要があります。 また、マネージド インスタンスと外部環境の DNS サフィックスを交換する必要があります。

次の図は、混合環境間の名前解決を示しています。

DTC を使用する場合の混合環境間での名前解決を示す図。

注意

XA トランザクションにのみ DTC を使用する予定の場合は、DNS 設定を構成する必要はありません。

DNS サフィックスを交換するには:

  1. Azure portal で、マネージド インスタンスに移動します。

  2. 左側のメニューの [設定] で、[分散トランザクション コーディネーター] を選択します。 [ネットワーク] タブを選択します。

    Azure portal のマネージド インスタンスの [DTC] ペインにある [ネットワーク] タブを示すスクリーンショット。[新しい外部 DNS サフィックス] が強調表示されています。

  3. [DNS の構成] で、[新しい外部 DNS サフィックス] を選択します。 外部環境の DNS サフィックスを入力します (例: dnszone1.com)。

  4. "DTC ホストの DNS サフィックス" の値をコピーします。 次に、外部環境で PowerShell コマンド Set-DnsClientGlobalSetting -SuffixSearchList $list を使用して、DTC ホストの DNS サフィックスを設定します。 たとえば、サフィックスが abc1111111.database.windows.net の場合は、$list パラメーターを定義して既存の DNS 設定を取得します。 その後、次の例のように、それにサフィックスを追加します。

    $list = (Get-DnsClientGlobalSetting).SuffixSearchList + "abc1111111.database.windows.net"
    Set-DnsClientGlobalSetting -SuffixSearchList $list
    

ネットワーク接続をテストする

ネットワークと DNS を構成したら、マネージド インスタンスの DTC エンドポイントと外部 DTC ホストの間で Test-NetConnection (TNC) を実行します。

接続をテストするには、まずユーザーによる構成が可能な値を更新します。 次に、外部環境で次の PowerShell スクリプトを使用して、DTC ホスト マネージド インスタンスの完全修飾ドメイン名 (FQDN) を特定します。 次に例を示します。

# =============================================================== 
# Get DTC settings 
# =============================================================== 
# User-configurable values 
# 

$SubscriptionId = "a1a1a1a1-8372-1d28-a111-1a2a31a1a1a1" 
$RgName = "my-resource-group" 
$MIName = "my-instance-name" 

# =============================================================== 
# 

$startMoveUri = "https://management.azure.com/subscriptions/" + $SubscriptionId + "/resourceGroups/" + $RgName + "/providers/Microsoft.Sql/managedInstances/" + $MIName + "/dtc/current?api-version=2022-05-01-preview" 
Write-Host "Sign in to Azure subscription $SubscriptionID ..." 
Select-AzSubscription -SubscriptionName $SubscriptionID 
$azContext = Get-AzContext 
$azProfile = [Microsoft.Azure.Commands.Common.Authentication.Abstractions.AzureRmProfileProvider]::Instance.Profile 
$profileClient = New-Object -TypeName Microsoft.Azure.Commands.ResourceManager.Common.RMProfileClient -ArgumentList ($azProfile) 
Write-Host "Getting authentication token for REST API call ..." 
$token = $profileClient.AcquireAccessToken($azContext.Subscription.TenantId) 
$authHeader = @{'Content-Type'='application/json';'Authorization'='Bearer ' + $token.AccessToken} 


# Invoke API call to start the operation 
# 

Write-Host "Starting API call..." 
$startMoveResp = Invoke-WebRequest -Method Get -Headers $authHeader -Uri $startMoveUri 
Write-Host "Response:" $startMoveResp 

# End 
# =============================================================== 

JSON の出力は次の FQDN 例のようになります。

chn000000000000.zcn111111111.database.windows.net

各値の説明:

  • chn000000000000 は、マネージド インスタンス DTC ホストの NetBIOS 名です。
  • zcn111111111.database.windows.net は DNS サフィックスです。

次に、ポート 135 のマネージド インスタンス DTC ホストの FQDN と NetBIOS 名の両方に対して TNC を実行します。 次の例では、最初のエントリによってネットワーク接続を確認します。 2 番目のエントリでは、DNS 設定が正しいことを確認します。

tnc chn000000000000.zcn111111111.database.windows.net -Port 135 
tnc chn000000000000 -Port 135 

接続と DNS サフィックスが正しく構成されている場合は、TcpTestSucceeded : True という出力が表示されます。

マネージド インスタンス側で、SQL Agent ジョブを作成し、TNC PowerShell コマンドを実行して外部ホストへの接続をテストします。

たとえば、外部ホストの FQDN が host10.dnszone1.com の場合は、SQL Agent ジョブを使用して次のテストを実行します。

tnc host10.dnszone1.com -Port 135 
tnc host10 -Port 135 

制限事項

SQL Managed Instance で DTC を使用する場合は、次の制限事項を考慮してください。

  • SQL Managed Instance とサード パーティの RDBMS 間での分散 T-SQL トランザクションの実行はサポートされていません。 SQL Managed Instance では、サード パーティの RDBMS を使用しているリンク サーバーはサポートされていません。 逆に、マネージド インスタンスおよび SQL Server と、他の SQL Server ベース製品との間で分散 T-SQL トランザクションを実行することは、サポートされています。
  • 外部環境内のホスト名は 15 文字以下にする必要があります。
  • Azure SQL Database への分散トランザクションは DTC ではサポートされていません。
  • 認証については、DTC では "認証なし" のオプションのみがサポートされています。 相互認証と着信呼び出し側認証のオプションは使用できません。 DTC はユーザー データではなく同期メッセージのみを交換するため、また仮想ネットワークとのみ通信するため、この制限はセキュリティ上のリスクではありません。

トランザクションを管理する

分散トランザクションの統計を表示するには、「sys.dm_tran_distributed_transaction_stats」を参照してください。

sp_reset_dtc_log ストアド プロシージャを使用して DTC ログをリセットできます。

分散トランザクションは、sys.sp_manage_distributed_transaction ストアド プロシージャを使用して管理できます。

次の手順

ネイティブ マネージド インスタンスの分散トランザクションのサポートについては、エラスティック トランザクションに関するページを参照してください。