次の方法で共有


Always On 可用性グループのクラスター化された DTC リソースを作成する

適用対象:SQL Server - Windows のみ

この記事では、SQL Server の Always On 可用性グループ (AG) のクラスター化された DTC リソースを完全に構成する方法について説明します。 完全構成の完了には最大 1 時間かかることがあります。

このチュートリアルでは、クラスター化された DTC リソースと SQL Server AG を「Always On 可用性グループの DTC サービスをクラスター化する方法」の要件に基づいて作成します。

このチュートリアルでは、PowerShell スクリプトと Transact-SQL (T-SQL) スクリプトが使用されます。 T-SQL スクリプトの多くで SQLCMD モード を有効にする必要があります。 SQLCMD モードの詳細については、「クエリ エディターによる SQLCMD スクリプトの編集」を参照してください。 PowerShell モジュール FailoverClusters をインポートする必要があります。 PowerShell モジュールのインポートに関する詳細については、PowerShell モジュールのインポートに関する記事を参照してください。 このチュートリアルは以下の構成オプションを前提条件とします。

  • Always On 可用性グループの前提条件、制限事項、推奨事項」の要件をすべて満たしています。
  • ドメインが contoso.labです。
  • DTC ネットワーク名リソースが作成される OU でコンピューター オブジェクトを作成する権限がユーザーに与えられています。
  • ユーザーはドメイン ユーザーであり、クラスター内の全ノードに対する管理者権限を持っています。
  • sqlbackups という名前のファイル共有がバックアップのために作成されています。
  • SQL Server の既定のインスタンスが名前付きの SQLNODE1SQLNODE2です。
  • SQL Server のすべてのインスタンスで同じサービス アカウントが使用されています。
  • SQL Server のすべてのインスタンスで、ユーザーが固定の SQL Server ロール sysadmin のメンバーです。
  • DTC で解決できないトランザクションの既定の結果は presume commit に設定されます。
  • ミラーリング エンドポイントでポート 5022が使用されます。
  • AG やクラスター化された DTC リソースが他に存在しません。
  • クラスターの詳細 (既存):
    • 名前: Cluster
    • ネットワーク名: Cluster Network 1
    • 複数ノード: SQLNODE1, SQLNODE2
    • 共有ストレージ:Cluster Disk 3 (SQLNODE1 が所有)
  • クラスターの詳細 (作成予定):
    • ネットワーク名リソース: DTCnet1
    • DTC ネットワーク名リソース: DTC1
    • DTC 物理ディスク リソース: DTCDisk1
    • DTC IP とサブネット リソース: 192.168.2.54255.255.255.0
    • DTC IP リソース: DTCIP1

1.オペレーティング システムを確認する

サポートされている分散トランザクションの場合、Always On 可用性グループ が Windows Server 2012 R2 以降のバージョンで実行されている必要があります。 Windows Server 2012 R2 の場合は、KB3090973 の更新プログラムをインストールする必要があります。 このスクリプトは、オペレーティング システムのバージョンをチェックし、修正プログラム 3090973 をインストールする必要があるかどうかを指定します。 SQLNODE1 で次の PowerShell スクリプトを実行します。

# A few OS checks

<#
Script:
    1) is re-runnable
    2) will work on any node in the cluster, and
    3) will execute against every node in the cluster
#>

$nodes = (Get-ClusterNode).Name;
foreach ($node in $nodes) {

    # At least 2012 R2
    $os = (Get-WmiObject -class Win32_OperatingSystem -ComputerName $node).caption;
    if ($os -like "*2012 R2*" -or $os -like "*2016*" -or $os -like "*2019*" -or $os -like "*2022*") {
        Write-Host "$os is supported on $node.";
    }
    else {
        Write-Host "STOP! $os is not supported on $node.";
    }

    # KB 3090973
    if ($os -like "*2012 R2*") {
        $kb = Get-Hotfix -ComputerName $node | Where { $_.HotFixID -eq 'KB3090973' };
        if ($kb) {
            Write-Host "KB3090973 is installed on $node."
        }
        else {
            Write-Host "HotFixID KB3090973 must be applied on $node. See https://support.microsoft.com/help/3090973 for additional information and to download the hotfix.";
        }
    }
    else {
        Write-Host "KB3090973 does not apply to $os on $node."
    }
}

2. ファイアウォール規則の構成

このスクリプトは、AG のレプリカをホストしている各 SQL Server と、分散トランザクションに関与しているその他すべてのサーバーで DTC トラフィックが許可するようにファイアウォールを構成します。 また、データベース ミラーリング エンドポイントの接続を許可するようにファイアウォールを構成することもできます。 SQLNODE1 で次の PowerShell スクリプトを実行します。

# Configure Firewall

<#
Script:
    1) is re-runnable
    2) will work on any node in the cluster, and
    3) will execute against every node in the cluster
#>

$nodes = (Get-ClusterNode).Name;
foreach ($node in $nodes) {
    Get-NetFirewallRule -CimSession $node -DisplayGroup 'Distributed Transaction Coordinator' -Enabled False -ErrorAction SilentlyContinue | Enable-NetFirewallRule;
    New-NetFirewallRule -CimSession $node -DisplayName 'SQL Server Mirroring' -Description 'Port 5022 for SQL Server Mirroring' -Action Allow -Direction Inbound -Protocol TCP -LocalPort 5022 -RemotePort Any -LocalAddress Any -RemoteAddress Any;
};

3. in-doubt xact resolution を構成する

このスクリプトは、未確定トランザクションに対して "コミットを推測する" ように in-doubt xact resolution サーバー構成オプションを構成します。

SQLCMD モードSQLNODE1 に対して SQL Server Management Studio (SSMS) の次の T-SQL スクリプトを実行します。

/*******************************************************************
    Execute script in its entirety on SQLNODE1 in SQLCMD mode
*******************************************************************/
-- Configure in-doubt xact resolution on all SQL Server instances to presume commit
IF (
    SELECT CAST(value_in_use AS BIT)
    FROM sys.configurations WITH (NOLOCK)
    WHERE [name] = N'show advanced options'
) = 0
BEGIN
    EXEC sp_configure 'show advanced options', 1;
    RECONFIGURE;
END

-- Configure the server to presume commit for in-doubt transactions.
IF (
    SELECT CAST(value AS BIT)
    FROM sys.configurations WITH (NOLOCK)
    WHERE [name] = N'in-doubt xact resolution'
) <> 1
BEGIN
    EXEC sp_configure 'in-doubt xact resolution', 1;
    RECONFIGURE;
END
GO

-----------------------------------------------------------------------------
:connect SQLNODE2

IF (
    SELECT CAST(value_in_use AS BIT)
    FROM sys.configurations WITH (NOLOCK)
    WHERE [name] = N'show advanced options'
) = 0
BEGIN
    EXEC sp_configure 'show advanced options', 1;
    RECONFIGURE;
END

-- Configure the server to presume commit for in-doubt transactions.
IF (
    SELECT CAST(value AS BIT)
    FROM sys.configurations WITH (NOLOCK)
    WHERE [name] = N'in-doubt xact resolution'
) <> 1
BEGIN
    EXEC sp_configure 'in-doubt xact resolution', 1;
    RECONFIGURE;
END
GO

4.テスト データベースを作成する

このスクリプトは、SQLNODE1AG1 という名前のデータベースを作成し、SQLNODE2dtcDemoAG1 という名前のデータベースを作成します。 SQLCMD モードSQLNODE1 に対して SSMS の次の T-SQL スクリプトを実行します。

/*******************************************************************
    Execute script in its entirety on SQLNODE1 in SQLCMD mode
*******************************************************************/
-- On SQLNODE1
USE master;
GO

SET NOCOUNT ON;

IF EXISTS (
    SELECT *
    FROM sys.databases
    WHERE name = N'AG1'
)
BEGIN
    DROP DATABASE AG1;
END
GO

CREATE DATABASE AG1;
GO

ALTER DATABASE AG1
SET RECOVERY FULL WITH NO_WAIT;

ALTER AUTHORIZATION ON DATABASE::AG1 TO sa;
GO

USE AG1;

CREATE TABLE [dbo].[Names] (
    [Name] [varchar](64) NULL,
    [EditDate] DATETIME
);

INSERT [dbo].[Names]
VALUES ('AG1', GETDATE());
GO

-- Against SQNODE2
:connect SQLNODE2

USE master;
GO

SET NOCOUNT ON;

IF EXISTS (
    SELECT *
    FROM sys.databases
    WHERE name = N'dtcDemoAG1'
)
BEGIN
    DROP DATABASE dtcDemoAG1;
END
GO

CREATE DATABASE dtcDemoAG1;
GO

ALTER DATABASE dtcDemoAG1
SET RECOVERY SIMPLE WITH NO_WAIT;

ALTER AUTHORIZATION ON DATABASE::dtcDemoAG1 TO sa;
GO

USE dtcDemoAG1;
GO

CREATE TABLE [dbo].[Names] (
    [Name] [varchar](64) NULL,
    [EditDate] DATETIME
);
GO

5. エンドポイントを作成する

このスクリプトは、TCP ポート 5022 をリッスンする AG1_endpoint という名前のエンドポイントを作成します。 SQLCMD モードSQLNODE1 に対して SSMS の次の T-SQL スクリプトを実行します。

/**********************************************
Execute on SQLNODE1 in SQLCMD mode
**********************************************/
-- Create endpoint on the server instance that hosts the primary replica:
IF NOT EXISTS (SELECT * FROM sys.database_mirroring_endpoints)
BEGIN
    CREATE ENDPOINT AG1_endpoint AUTHORIZATION [sa]
        STATE = STARTED
        AS TCP (LISTENER_PORT = 5022)
    FOR DATABASE_MIRRORING(ROLE = ALL);
END
GO

-----------------------------------------------------------------------------
:connect SQLNODE2

IF NOT EXISTS (SELECT *FROM sys.database_mirroring_endpoints)
BEGIN
    CREATE ENDPOINT AG1_endpoint AUTHORIZATION [sa]
        STATE = STARTED
        AS TCP (LISTENER_PORT = 5022)
    FOR DATABASE_MIRRORING(ROLE = ALL);
END
GO

6. 可用性グループに使用するデータベースを準備する

このスクリプトは SQLNODE1AG1 をバックアップし、SQLNODE2 に復元します。 SQLCMD モードSQLNODE1 に対して SSMS の次の T-SQL スクリプトを実行します。

/*******************************************************************
    Execute script in its entirety on SQLNODE1 in SQLCMD mode
*******************************************************************/
-- Backup database
BACKUP DATABASE AG1 TO DISK = N'\\sqlnode1\sqlbackups\AG1.bak'
WITH FORMAT, STATS = 10;

-- Backup transaction log
BACKUP LOG AG1 TO DISK = N'\\sqlnode1\sqlbackups\AG1_Log.bak'
WITH FORMAT, STATS = 10;
GO

-- Restore database and logs on secondary WITH NORECOVERY
:connect SQLNODE2

USE [master];
GO

RESTORE DATABASE AG1
FROM DISK = N'\\sqlnode1\sqlbackups\AG1.bak'
WITH NORECOVERY, STATS = 10;

RESTORE LOG AG1
FROM DISK = N'\\sqlnode1\sqlbackups\AG1_Log.bak'
WITH NORECOVERY, STATS = 10;
GO

7. 可用性グループを作成する

Always On 可用性グループは、CREATE AVAILABILITY GROUP コマンドと WITH DTC_SUPPORT = PER_DB 句を使用して作成する必要があります。 現在、既存の AG を変更することはできません。 新しい可用性グループ ウィザードでは、新しい AG に対して DTC サポートを有効にすることができません。 次のスクリプトは新しい AG を作成し、セカンダリに参加します。 SQLCMD モードSQLNODE1 に対して SSMS の次の T-SQL スクリプトを実行します。

/*******************************************************************
    Execute the script in its entirety on SQLNODE1 in SQLCMD mode
*******************************************************************/
--  Create availability group on SQLNODE1
USE master;
GO

CREATE AVAILABILITY GROUP DTCAG1
WITH (DTC_SUPPORT = PER_DB)
FOR DATABASE AG1 REPLICA ON
'SQLNODE1' WITH (
    ENDPOINT_URL = 'TCP://SQLNODE1.contoso.lab:5022',
    AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
    FAILOVER_MODE = MANUAL
),
'SQLNODE2' WITH (
    ENDPOINT_URL = 'TCP://SQLNODE2.contoso.lab:5022',
    AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
    FAILOVER_MODE = MANUAL
);
GO

-- SQLNODE2
-- Join a secondary replica to the availability group
:connect SQLNODE2

ALTER AVAILABILITY GROUP DTCag1 JOIN;

-- Join the database to the availability group
ALTER DATABASE AG1
SET HADR AVAILABILITY GROUP = DTCAG1;
GO

SQL Server 2016 (13.x) の Service Pack 2 以降では、分散トランザクションの可用性グループを変更できます。 Service Pack 2 より前の SQL Server 2016 (13.x) のバージョンでは、既存の Always On 可用性グループで DTC を有効にすることはできません。 SQL Server は、既存の AG に対して次の構文を受け入れます。

USE master;
GO
ALTER AVAILABILITY GROUP <availability_group>
SET (DTC_Support = Per_DB);

ただし、構成の変更は行われません。 次の T-SQL クエリで dtc_support 構成を確定できます。

SELECT name, dtc_support FROM sys.availability_groups; 

Service Pack 2 より前の SQL Server 2016 (13.x) のバージョンの AG で DTC サポートを有効にする唯一の方法は、Transact-SQL を使って AG を作成することです。

8. クラスター リソースを準備する

このスクリプトは、DTC 依存リソース(ディスクと IP) を準備します。 共有ストレージが Windows クラスターに追加されます。 ネットワーク リソースが作成され、次に DTC が作成されて、AG のリソースとなります。 SQLNODE1 で次の PowerShell スクリプトを実行します。 このスクリプトは、SQL Server のクラスター化されたインスタンスに対して DTC を適切に構成する方法 (改訂版) に関する記事に記載されているサンプルが基になっています。

# Create a clustered Microsoft Distributed Transaction Coordinator properly in the resource group with SQL Server

<#----------------------------------- Begin User Input -----------------------------------#>
$AGgrp = "DTCag1"; # Name of the WSFC resource group that will contain the DTC resource

$WSFC = (Get-Cluster).Name; # Windows Failover Cluster name
$DTCnetwk = "Cluster Network 1" # WSFC Network to use for the DTC IP address

$ClusterAvailableDisk = "Cluster Disk 3"; # Designated disk that can support failover clustering and is visible to all nodes but not yet part of the set of clustered disks
$DTCdisk = "DTCDisk1"; # Name of the disk to be used with DTC

$DTCipresnm = "DTCIP1"; # WSFC Friendly Name of the DTC's IP resource
$DTCipaddr = "192.168.2.54"; # IP address of the DTC resource
$DTCsubnet = "255.255.255.0"; # Subnet for the DTC IP address
$DTCnetnm = "DTCNet1"; # WSFC Friendly Name of the Network Name resource
$DTCresnm = "DTC1"; # Name of the WSFC DTC Network Name resource; Name must be unique in AD
<#------------------------------------ End User Input ------------------------------------#>

# Make a new disk available for use in a failover cluster.
Get-ClusterAvailableDisk | Where-Object { $_.Name -eq $ClusterAvailableDisk } | Add-ClusterDisk;

# Rename disk
$resource = Get-ClusterResource $ClusterAvailableDisk; $resource.Name = $DTCdisk;

# Create the IP resource
Add-ClusterResource -Name $DTCipresnm -ResourceType "IP Address" -Group $AGgrp;

# Set the network to use, IP address, and subnet
# All three have to be configured at the same time
$DTCIPres = Get-ClusterResource $DTCipresnm;
$ntwk = New-Object Microsoft.FailoverClusters.PowerShell.ClusterParameter $DTCipres, Network, $DTCnetwk;
$ipaddr = New-Object Microsoft.FailoverClusters.PowerShell.ClusterParameter $DTCipres, Address, $DTCipaddr;
$subnet = New-Object Microsoft.FailoverClusters.PowerShell.ClusterParameter $DTCipres, SubnetMask, $dtcsubnet;

$setdtcipparams = $ntwk, $ipaddr, $subnet;
$setdtcipparams | Set-ClusterParameter;

# Create the Network Name resource
Add-ClusterResource $DTCnetnm -ResourceType "Network Name" -Group $AGgrp;

# Set the value for the Network Name resource
Get-ClusterResource $DTCnetnm | Set-ClusterParameter DnsName $DTCresnm;

# Add the IP address as a depenency of the Network Name resource
Add-ClusterResourceDependency $DTCnetnm $DTCipresnm;

# Create the Distributed Transaction Coordinator resource
Add-ClusterResource $DTCresnm -ResourceType "Distributed Transaction Coordinator" -Group $AGgrp;

# Add the Network Name as a dependency of the DTC resource
Add-ClusterResourceDependency $DTCresnm $DTCnetnm;

# Move the disk into the resource group with SQL Server
Move-ClusterResource -Name $DTCdisk -Group $AGgrp;

# Add the disk as a dependency of the DTC resource
Add-ClusterResourceDependency $DTCresnm $DTCdisk;

# Bring the IP resource online
Start-ClusterResource $DTCipresnm;

# Bring the Network Name resource online
Start-ClusterResource $DTCnetnm;

# Bring the DTC resource online
Start-ClusterResource $DTCresnm;

9. ネットワーク DTC アクセスを有効にする

次のスクリプトはクラスター化された DTC サービスに対してネットワーク DTC アクセスを有効にし、リモート コンピューターがネットワーク経由で分散トランザクションに参加できるようにします。 SQLNODE1 で次の PowerShell スクリプトを実行します。

# Enable Network DTC access for the clustered DTC service

<#
Script:
    1) is re-runnable
    2) will work on any node in the cluster, and
    3) will execute against every node in the cluster
#>

# Enter the Name of DTC resource

$DtcName = "DTC1";
<# ------- End of User Input ------- #>

[bool]$restart = 0;
$node = (Get-ClusterResource -Name $DtcName).OwnerNode.Name;
$DtcSettings = Get-DtcNetworkSetting -DtcName $DtcName;

if ($DtcSettings.InboundTransactionsEnabled -eq $false) {
    Set-DtcNetworkSetting -CimSession $node -DtcName $DtcName -AuthenticationLevel "Mutual" -InboundTransactionsEnabled $true -Confirm:$false;
    $restart = 1;
}

if ($DtcSettings.OutboundTransactionsEnabled -eq $false) {
    Set-DtcNetworkSetting -CimSession $node -DtcName $DtcName -AuthenticationLevel "Mutual" -OutboundTransactionsEnabled $true -Confirm:$false;
    $restart = 1;
}

if ($restart -eq 1) {
    Stop-Dtc -CimSession $node -DtcName $DTCname -Confirm:$false;
    Start-Dtc -CimSession $node -DtcName $DTCname;
}

10. 各ノードでローカル DTC サービスを無効にして停止する

両方のノードでローカルの DTC を無効にし、分散トランザクションでクラスター化された DTC リソースが使用されることを保証します。 次のスクリプトは、各ノードでローカル DTC サービスを無効にして停止します。 SQLNODE1 で次の PowerShell スクリプトを実行します。

# Disable local DTC service

<#
Script:
    1) is re-runnable
    2) will work on any node in the cluster, and
    3) will execute against every node in the cluster
#>

$DTCname = 'Local';
$nodes = (Get-ClusterNode).Name;

foreach ($node in $nodes) {

    $service = Get-WmiObject -class Win32_Service -computername $node -Filter "Name='MSDTC'";
    if ($service.StartMode -ne 'Disabled') {
        $service.ChangeStartMode('Disabled');
    }

    if ($service.State -ne 'Stopped') {
        $service.StopService();
    }
}

11. 各インスタンスの SQL Server サービスを停止し、すぐに起動する

クラスター化された DTC サービスが完全に構成されたら、この DTC サービスを使用するように SQL Server が登録されていることを確認するために、AG 内の SQL Server の各インスタンスを停止して再起動する必要があります。

最初の SQL Server サービスには、分散トランザクションが必要です。 それは DTC サービスに登録されます。 SQL Server サービスでは、再起動されるまでその DTC サービスの使用が継続されます。 クラスター化された DTC サービスが使用可能な場合は、SQL Server はそのクラスター化された DTC サービスに登録されます。 クラスター化された DTC サービスが使用できない場合は、SQL Server はローカル DTC サービスに登録されます。 SQL Server がクラスター化された DTC サービスに登録されていることを確認するために、SQL Server の各インスタンスを停止して再起動します。

次の T-SQL スクリプトに含まれている手順に従います。

/*
Gracefully cycle the SQL Server service and failover the availability group
    a.    On SQLNODE2, cycle the SQL Server service from SQL Server Configuration Manager

    b.    On SQLNODE2 failover, the availability group to SQLNODE2
        Execute the T-SQL script below on SQLNODE2 (Use Results to Text)

    c.    On SQLNODE1, cycle the SQL Server service from SQL Server Configuration Manager

    d.    On SQLNODE1, failover the availability group to SQLNODE1 once the databases are back in sync.
        Execute the T-SQL script below on SQLNODE1 (Use Results to Text)
*/
SET NOCOUNT ON;

-- Ensure replica is secondary
IF (
    SELECT rs.is_primary_replica
    FROM sys.availability_groups ag
    INNER JOIN sys.dm_hadr_database_replica_states rs
        ON ag.group_id = rs.group_id
    WHERE ag.name = N'DTCag1' AND rs.is_local = 1
) = 0
BEGIN
    -- Wait for SYNCHRONIZED state
    DECLARE @ctr TINYINT = 0;
    DECLARE @msg VARCHAR(128);

    WHILE (
        SELECT synchronization_state
        FROM sys.availability_groups ag
        INNER JOIN sys.dm_hadr_database_replica_states rs
            ON ag.group_id = rs.group_id
        WHERE ag.name = N'DTCag1'
            AND rs.is_primary_replica = 0
            AND rs.is_local = 1
    ) <> 2
    BEGIN
        WAITFOR DELAY '00:00:01';

        SET @ctr += 1;
        SET @msg = 'Waiting for databases to become synchronized. Duration in seconds: ' + cast(@ctr AS VARCHAR(3));

        RAISERROR (@msg, 0, 1) WITH NOWAIT;
    END;

    ALTER AVAILABILITY GROUP DTCAG1 FAILOVER;
    SELECT 'Failover complete' AS [Sucess];
END;
ELSE
BEGIN
    SELECT 'This instance is the primary replica. Connect to the secondary replica and try again.' AS [Error];
END;

12. 構成をテストする

このテストでは、SQLNODE1 から SQLNODE2 へのリンク サーバーを使用して、分散トランザクションを作成します。 AG プライマリ レプリカが SQLNODE1 上にあることを確認します。 構成をテストする目的で、次の操作を行います。

  • リンク サーバーを作成する
  • 分散トランザクションを実行する

リンク サーバーを作成する

次のスクリプトは、 SQLNODE1 で 2 つのリンク サーバーを作成します。 SQLNODE1に対して SSMS の次の T-SQL スクリプトを実行します。

-- SQLNODE1
IF NOT EXISTS (SELECT * FROM sys.servers WHERE name = N'SQLNODE1')
BEGIN
    EXEC master.dbo.sp_addlinkedserver @server = N'SQLNODE1';
END

IF NOT EXISTS (SELECT * FROM sys.servers WHERE name = N'SQLNODE2')
BEGIN
    EXEC master.dbo.sp_addlinkedserver @server = N'SQLNODE2';
END

分散トランザクションを実行する

このスクリプトは最初に、現在の DTC トランザクションの統計を返します。 次に、SQLNODE1SQLNODE2 でデータベースを利用して分散トランザクションを実行します。 次に、スクリプトは DTC トランザクションの統計を返しますが、今度は数が増えているはずです。 SQLNODE1 に物理的に接続し、SQLCMD モードSQLNODE1 に対して SSMS の次の T-SQL スクリプトを実行します。

/*******************************************************************
    Execute the script in its entirety on SQLNODE1 in SQLCMD mode
    Must be physically connected to SQLNODE1
*******************************************************************/
USE AG1;
GO
SET NOCOUNT ON;

-- Get Baseline
!! Powershell; $DtcNameC = Get-DtcClusterDefault; Get-DtcTransactionsStatistics -DtcName $DtcNameC;

SET XACT_ABORT ON
BEGIN DISTRIBUTED TRANSACTION
    INSERT INTO SQLNODE1.[AG1].[dbo].[Names] VALUES ('TestValue1', GETDATE());
    INSERT INTO SQLNODE2.[dtcDemoAG1].[dbo].[Names] VALUES ('TestValue2', GETDATE());
COMMIT TRAN
GO

-- Review DTC Transaction Statistics
!! Powershell; $DtcNameC = Get-DtcClusterDefault; Get-DtcTransactionsStatistics -DtcName $DtcNameC;

重要

USE AG1 ステートメントを実行し、データベース コンテキストを AG1に設定する必要があります。 そうしないと、次のエラー メッセージを受け取ります。"トランザクション コンテキストを他のセッションが使用中です。"