適用対象:Azure SQL Managed Instance
この記事では、Azure SQL Managed Instance 用の分散トランザクション コーディネーター (DTC) の概要について説明します。 DTC を使用して、混合環境で分散トランザクションを実行できます。 これには、SQL マネージド インスタンス、SQL Server インスタンス、他のリレーショナル データベース管理システム (RDBMS)、カスタム アプリケーション、Azure へのネットワーク接続を確立できる任意の環境でホストされているその他のトランザクション参加者が含まれます。
シナリオ
Azure SQL Managed Instance 用の DTC によって、Azure へのネットワーク接続を確立できるさまざまな環境間で分散トランザクションを実行できます。 SQL Managed Instance 用 DTC は "マネージド" です。つまり、Azure がログ、ストレージ、DTC の可用性、ネットワークなどの管理とメンテナンスを行います。 マネージドの側面とは別に、SQL Managed Instance 用の DTC は、SQL Server の従来の分散トランザクションをサポートする同じ DTC Windows サービスです。
DTC for SQL Managed Instance は、XA、.NET、T-SQL、COM+、ODBC、JDBC など、さまざまなテクノロジとシナリオのロックを解除します。
分散トランザクションを実行するには、次のタスクを実行します。
- DTC を構成する。
- 参加要素間のネットワーク接続を有効にする。
- DNS 設定を構成する。
Note
SQL マネージド インスタンスによってのみホストされるデータベース間の T-SQL または .NET 分散トランザクションの場合は、 分散トランザクションのネイティブ サポートを使用することをお勧めします。
要件
DTC 設定を変更するには、 Microsoft.Sql/managedInstances/dtc リソースに対する書き込みアクセス許可が必要です。 DTC 設定を表示するには、 Microsoft.Sql/managedInstances/dtc リソースの読み取りアクセス許可が必要です。
ポート 135 では受信と送信の両方の通信を許可する必要があります。ポート範囲 14000 から 15000 は受信を許可する必要があり、49152 から 65535 は、SQL マネージド インスタンスの仮想 ネットワーク セキュリティ グループ と外部環境で設定されているファイアウォールの両方で送信通信を許可する必要があります。
DTC を構成する
DTC は、Azure portal、Azure PowerShell、Azure CLI を使用して構成できます。
Azure portal を使用して DTC を構成するには、次の手順に従います。
Azure portal で、SQL マネージド インスタンスに移動します。
[ 設定] で、[ 分散トランザクション コーディネーター] を選択します。
[基本] タブで、[分散トランザクション コーディネーター] を [有効] に設定します。
[セキュリティ] タブで、受信または送信トランザクションを許可し、XA または SNA LU を有効にします。
[ネットワーク] タブで、DTC の DNS を指定し、外部 DNS とネットワークを構成するための情報を取得します。
ネットワーク接続
DTC を使用するには、すべてのトランザクション参加者が Azure へのネットワーク接続を持っている必要があります。 SQL マネージド インスタンスは常に Azure の専用仮想ネットワークにデプロイされるため、外部環境を SQL マネージド インスタンスの仮想ネットワークに接続する必要があります。 このコンテキストでは、 外部 は SQL マネージド インスタンスではないオブジェクトまたはプロセスを参照します。 外部リソースで Azure の仮想ネットワークも使用している場合は、仮想ネットワーク ピアリングを使用できます。 それ以外の場合は、任意の方法を使用して接続を確立します。たとえば、ポイント対サイト VPN、Azure ExpressRoute、またはビジネス ニーズを満たす別のネットワーク接続テクノロジなどです。
ポート 135 では受信と送信の両方の通信を許可する必要があります。ポート範囲 14000 から 15000 は受信を許可する必要があり、49152 から 65535 は、SQL マネージド インスタンスの仮想 ネットワーク セキュリティ グループ と外部環境で設定されているファイアウォールの両方で送信通信を許可する必要があります。
DNS の設定
DTC は、双方向の通信のためにトランザクション参加者の NetBIOS 名に依存します。 Azure ネットワークでは NetBIOS プロトコルがサポートされておらず、混合環境では NetBIOS 名を解決できないため、SQL マネージド インスタンスの DTC はホスト名解決のために DNS ネーム サーバーに依存します。 SQL マネージド インスタンスの DTC ホストは、Azure DNS サーバーに自動的に登録されます。 外部 DTC ホストを DNS サーバーに登録する必要があります。 SQL マネージド インスタンスと外部環境でも、DNS サフィックスを交換する必要があります。
次の図は、混合環境間の名前解決を示しています。
Note
XA トランザクションにのみ DTC を使用する予定の場合は、DNS 設定を構成する必要はありません。
DNS サフィックスを交換するには:
Azure portal で、SQL マネージド インスタンスに移動します。
[設定] で [分散トランザクション コーディネーター] を選択し、[ネットワーク] タブを選択します。
[DNS の構成] で、[新しい外部 DNS サフィックス] を選択します。 外部環境の DNS サフィックスを入力します (例:
dnszone1.com)。"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 を構成したら、SQL マネージド インスタンスの DTC エンドポイントと外部 DTC ホストの間で Test-NetConnection (TNC) を実行します。
接続をテストするには、まずユーザーによる構成が可能な値を更新します。 次に、外部環境で次の PowerShell スクリプトを使用して、DTC ホスト SQL マネージド インスタンスの完全修飾ドメイン名 (FQDN) を識別します。 次に例を示します。
# ===============================================================
# Get DTC settings
# ===============================================================
# User-configurable values
#
$SubscriptionId = "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e"
$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は、SQL マネージド インスタンス DTC ホストの NetBIOS 名です。 -
zcn111111111.database.windows.netは DNS サフィックスです。
次に、ポート 135 の SQL マネージド インスタンス DTC ホストの FQDN と NetBIOS 名の両方に対して TNC を実行します。 次の例では、最初のエントリによってネットワーク接続を確認します。 2 番目のエントリでは、DNS 設定が正しいことを確認します。
tnc chn000000000000.zcn111111111.database.windows.net -Port 135
tnc chn000000000000 -Port 135
接続と DNS サフィックスが正しく構成されている場合は、TcpTestSucceeded : True という出力が表示されます。
SQL マネージド インスタンス側で、TNC PowerShell コマンドを実行して外部ホストへの接続をテストする SQL エージェント ジョブを作成します。
たとえば、外部ホストの 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 マネージド インスタンスと 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 ストアド プロシージャを使用して管理できます。