分散型 AG を使用して可用性グループを移行する
Azure Virtual Machines (VM) 上の SQL Server での移行後の高可用性とディザスター リカバリー (HADR) のサポートを維持しながら、分散型可用性グループ (AG) を使用して Always On 可用性グループ内のデータベースを移行します。
ソース SQL Server インスタンスが前提条件を満たしていることを検証したら、この記事の手順に従って、既存の可用性グループと、Azure VM 上の SQL Server 上のターゲットの可用性グループとの間に分散型可用性を作成します。
この記事は、可用性グループに参加しているデータベースを対象としており、Windows Server フェールオーバー クラスター (WSFC) と可用性グループ リスナーが必要です。 また、スタンドアロン SQL Server からインスタンス からデータベースを移行することもできます。
初期セットアップ
最初の手順では、Azure 内に SQL Server VM を作成します。 これを行うには、Azure portal、Azure PowerShell、または ARM テンプレートを使用します。
必ず、前提条件に従って SQL Server VM を構成してください。 Azure Load Balancer または分散ネットワーク名に依存してトラフィックを可用性グループ リスナーにルーティングする単一のサブネット デプロイと、そのような要件がないマルチサブネット デプロイのどちらかを選択します。 マルチサブネット デプロイが推奨されます。 詳細については、「接続」を参照してください。
わかりやすくするために、ターゲット SQL Server VM をソース SQL Server インスタンスと同じドメインに参加させます。 それ以外の場合は、ターゲット SQL Server VM を、ソース SQL Server インスタンスのドメインとフェデレーションされているドメインに参加させます。
自動シード処理を使用して分散型可用性グループ (DAG) を作成するには、DAG のグローバル プライマリ (ソース) のインスタンス名が、DAG のフォワーダー (ターゲット) のインスタンス名と一致する必要があります。 グローバル プライマリとフォワーダーの間にインスタンス名の不一致がある場合は、手動シード処理を使用して DAG を作成し、後でデータベース ファイルを手動で追加する必要があります。
この記事では、次のパラメーターの例を使用します。
- データベース名:
Adventureworks2022
- ソース マシン名:
OnPremNode1
(DAG のグローバル プライマリ)、OnPremNode2
- ソース SQL Server インスタンス名:
MSSQLSERVER
、MSSQLSERVER
- ソース可用性グループ名:
OnPremAg
- ソース可用性グループ リスナーの名前:
OnPremAG_LST
- ターゲット SQL Server VM 名
SQLVM1
(DAG 内のフォワーダー)、SQLVM2
- Azure VM 上のターゲット SQL Server のインスタンス名:
MSSQLSERVER
、MSSQLSERVER
- ターゲット可用性グループ名:
AzureAG
- ソース可用性グループ リスナーの名前:
AzureAG_LST
- エンドポイント名:
Hadr_endpoint
- 分散型可用性グループ名:
DAG
- ドメイン名:
Contoso
エンドポイントを作成する
Transact-SQL (T-SQL) を使用して、2 つのソース インスタンス (OnPremNode1
、OnPremNode2
) とターゲット SQL Server インスタンス (SQLVM1
、SQLVM2
) の両方にエンドポイントを作成します。
ソース インスタンスで可用性グループが既に構成されている場合は、2 つのターゲット インスタンスでのみこのスクリプトを実行します。
エンドポイントを作成するには、次の T-SQL スクリプトをソースとターゲットの両方のサーバーで実行します。
CREATE ENDPOINT [Hadr_endpoint] STATE = STARTED AS TCP (
LISTENER_PORT = 5022,
LISTENER_IP = ALL
)
FOR DATA_MIRRORING(ROLE = ALL,
AUTHENTICATION = WINDOWS NEGOTIATE,
ENCRYPTION = REQUIRED ALGORITHM AES);
GO
ドメイン アカウントではエンドポイントに自動的にアクセスできますが、サービス アカウントは自動的には sysadmin グループに含まれないことがあり、接続アクセス許可を持たないことがあります。 エンドポイントへの SQL Server サービス アカウントの接続アクセス許可を手動で付与するには、両方のサーバーで次の T-SQL スクリプトを実行します。
GRANT CONNECT ON ENDPOINT::[Hadr_endpoint] TO [<your account>];
ソース AG を作成する
分散型可用性グループは 2 つの個別の可用性グループにまたがる特殊な可用性グループであるため、最初に、2 つのソース SQL Server グループ インスタンスに可用性グループを作成する必要があります。
ソース インスタンスに既に可用性グループがある場合は、このセクションをスキップしてください。
Transact-SQL (T-SQL) を使用して、Adventureworks2022
データベースの例として、2 つのソース インスタンス (OnPremNode1
、OnPremNode2
) の間に可用性グループ (OnPremAG
) を作成します。
ソース インスタンスに可用性グループを作成するには、ソース プライマリ レプリカ (OnPremNode1
) でこのスクリプトを実行します。
CREATE AVAILABILITY GROUP [OnPremAG]
WITH (
AUTOMATED_BACKUP_PREFERENCE = PRIMARY,
DB_FAILOVER = OFF,
DTC_SUPPORT = NONE
)
FOR DATABASE [Adventureworks2022] REPLICA
ON N'OnPremNode1' WITH (
ENDPOINT_URL = N'TCP://OnPremNode1.contoso.com:5022',
FAILOVER_MODE = AUTOMATIC,
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
SEEDING_MODE = AUTOMATIC,
SECONDARY_ROLE(ALLOW_CONNECTIONS = NO)
),
N'OnPremNode2' WITH (
ENDPOINT_URL = N'TCP://OnPremNode2.contoso.com:5022',
FAILOVER_MODE = AUTOMATIC,
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
SEEDING_MODE = AUTOMATIC,
SECONDARY_ROLE(ALLOW_CONNECTIONS = NO)
);
次に、セカンダリ レプリカ(OnPremNode2
) を可用性グループ (OnPremAg
)に参加させます。
可用性グループに参加するには、ソース セカンダリ レプリカで次のスクリプトを実行します。
ALTER AVAILABILITY GROUP [OnPremAG] JOIN;
GO
ALTER AVAILABILITY GROUP [OnPremAG] GRANT CREATE ANY DATABASE;
GO
最後に、グローバル フォワーダー可用性グループ (OnPremAG
) のリスナーを作成します。
リスナーを作成するには、ソース プライマリ レプリカで次のスクリプトを実行します。
USE [master]
GO
ALTER AVAILABILITY GROUP [OnPremAG]
ADD LISTENER N'OnPremAG_LST' (
WITH IP (
(<available_static_ip>, <mask>),
PORT = 60173
)
);
GO
ターゲット AG を作成する
また、ターゲット SQL Server VM ターゲットにも可用性グループを作成する必要があります。
Azure の SQL Server インスタンス間で可用性グループが既に構成されている場合は、このセクションをスキップしてください。
Transact-SQL (T-SQL) を使用して、ターゲット SQL Server インスタンス (SQLVM1
とSQLVM2
) に可用性グループ (AzureAG
) を作成します。
ターゲットに可用性グループを作成するには、ターゲットのプライマリ レプリカで次のスクリプトを実行します。
CREATE AVAILABILITY GROUP [AzureAG] FOR REPLICA
ON N'SQLVM1' WITH (
ENDPOINT_URL = N'TCP://SQLVM1.contoso.com:5022',
FAILOVER_MODE = MANUAL,
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
BACKUP_PRIORITY = 50,
SECONDARY_ROLE(ALLOW_CONNECTIONS = NO),
SEEDING_MODE = AUTOMATIC
),
N'SQLVM2' WITH (
ENDPOINT_URL = N'TCP://SQLVM2.contoso.com:5022',
FAILOVER_MODE = MANUAL,
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
BACKUP_PRIORITY = 50,
SECONDARY_ROLE(ALLOW_CONNECTIONS = NO),
SEEDING_MODE = AUTOMATIC
);
GO
次に、ターゲットのセカンダリ レプリカ (SQLVM2
) を可用性グループ (AzureAG
) に参加させます。
ターゲットのセカンダリ レプリカで次のスクリプトを実行します。
ALTER AVAILABILITY GROUP [AzureAG] JOIN;
GO
ALTER AVAILABILITY GROUP [AzureAG] GRANT CREATE ANY DATABASE;
GO
最後に、ターゲット可用性グループ (AzureAG_LST
) のリスナー (AzureAG
) を作成します。 SQL Server VM を複数のサブネットにデプロイした場合は、Transact-SQL を使用してリスナーを作成します。 1 つのサブネットに SQL Server VM をデプロイした場合は、Azure Load Balancer、またはリスナーの分散ネットワーク名のいずれかを構成します。
リスナーを作成するには、Azure の可用性グループのプライマリ レプリカで次のスクリプトを実行します。
ALTER AVAILABILITY GROUP [AzureAG]
ADD LISTENER N'AzureAG_LST' (
WITH IP (
(N'<primary replica_secondary_ip>', N'<primary_mask>'),
(N'<secondary replica_secondary_ip>', N'<secondary_mask>')
),
PORT = <port_number_you_set>
);
GO
分散型 AG を作成する
ソース (OnPremAG
) とターゲット (AzureAG
) の可用性グループを構成した後、両方の個々の可用性グループにまたがる分散型可用性グループを作成します。
ソース SQL Server グローバル プライマリ (OnPremNode1
) と AG (OnPremAG
) で Transact-SQL を使用して、分散型可用性グループ (DAG
) を作成します。
ソースに分散型 AG を作成するには、ソース グローバル プライマリで次のスクリプトを実行します。
CREATE AVAILABILITY GROUP [DAG]
WITH (DISTRIBUTED) AVAILABILITY GROUP
ON 'OnPremAG' WITH (
LISTENER_URL = 'tcp://OnPremAG_LST.contoso.com:5022',
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
FAILOVER_MODE = MANUAL,
SEEDING_MODE = AUTOMATIC
),
'AzureAG' WITH (
LISTENER_URL = 'tcp://AzureAG_LST.contoso.com:5022',
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
FAILOVER_MODE = MANUAL,
SEEDING_MODE = AUTOMATIC
);
GO
Note
ターゲットとソースの SQL Server のバージョンが同じであるため、シード処理モードは AUTOMATIC
に設定されています。 SQL Server ターゲットのバージョンのほうが高い場合、またはグローバル プライマリとフォワーダーのインスタンス名が異なる場合は、分散型 AG を作成し、セカンダリ AG を SEEDING_MODE
がMANUAL
に設定されている分散型 AG に参加させます。 その後、データベースをソースからターゲットの SQL Server インスタンスに手動で復元します。 詳細については、移行中のバージョンのアップグレードに関する記事を参照してください。
分散型 AG が作成された後、ターゲットのフォワーダー インスタンス (SQLVM1
) のターゲット AG (AzureAG
) を分散型 AG (DAG
) に参加させます。
ターゲット AG を分散型 AG に参加させるには、ターゲット フォワーダーで次のスクリプトを実行します。
ALTER AVAILABILITY GROUP [DAG]
INNER JOIN AVAILABILITY GROUP
ON 'OnPremAG' WITH (
LISTENER_URL = 'tcp://OnPremAG_LST.contoso.com:5022',
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
FAILOVER_MODE = MANUAL,
SEEDING_MODE = AUTOMATIC
),
'AzureAG' WITH (
LISTENER_URL = 'tcp://AzureAG_LST.contoso.com:5022',
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
FAILOVER_MODE = MANUAL,
SEEDING_MODE = AUTOMATIC
);
GO
ソースとターゲットの可用性グループ間の同期を取り消し、一時停止、または遅延させる必要がある (パフォーマンスの問題など) 場合は、ソース グローバル プライマリ インスタンス (OnPremNode1
) で次のスクリプトを実行します。
ALTER AVAILABILITY GROUP [DAG]
MODIFY AVAILABILITY GROUP ON 'AzureAG'
WITH (SEEDING_MODE = MANUAL);
詳細については、「フォワーダーへの自動シード処理を取り消す」を参照してください。