リンクのフェールオーバー - Azure SQL Managed Instance

適用対象: Azure SQL Managed Instance

この記事では、ディザスター リカバリーや移行を目的として SQL Server Management Studio (SSMS) または PowerShell を使用し、SQL Server と Azure SQL Managed Instance 間でリンクされたデータベースをフェールオーバーする方法を説明します。

前提条件

リンクを通じてデータベースをセカンダリ レプリカにフェールオーバーするには、次の前提条件を満たす必要があります。

ワークロードを停止する

データベースをセカンダリ レプリカにフェールオーバーする準備ができたら、まず、メンテナンス時間中にプライマリ レプリカ上のアプリケーション ワークロードを停止します。 これにより、データベース レプリケーションがセカンダリに追いつくことができるため、データを失うことなくセカンダリにフェールオーバーできます。 フェールオーバーする前に、アプリケーションがプライマリにトランザクションをコミットしていないことを確認します。

データベースのフェールオーバー

Transact-SQL (T-SQL)、SQL Server Management Studio または PowerShell を使用して、リンクされたデータベースをフェールオーバーできます。

SQL Server 2022 CU13 (KB5036432) 以降の Transact-SQL (現在プレビュー段階) を使用して、リンクをフェールオーバーできます。

リンクの計画フェールオーバーを行うには、プライマリ レプリカで次の T-SQL コマンドを使用します。

ALTER AVAILABILITY GROUP [<DAGname>] FAILOVER

強制フェールオーバーを行うには、セカンダリ レプリカで次の T-SQL コマンドを使用します。

ALTER AVAILABILITY GROUP [<DAGname>] FORCE_FAILOVER_ALLOW_DATA_LOSS

フェールオーバー後のデータベースを確認する

SQL Server 2022 の場合、リンクを維持した場合は、SQL Server Management Studio のオブジェクト エクスプローラーAvailability Groups で分散可用性グループが存在することを確認できます。

フェールオーバー中にリンクを削除した場合は、オブジェクト エクスプローラーを使用すると分散型可用性グループがなくなったことを確認できます。 可用性グループを保持した場合、データベースは同期されたままとなります。

フェールオーバー後のクリーンアップ

[フェールオーバーの成功後にリンクを削除する] が選択されていない限り、SQL Server 2022 でフェールオーバーしてもリンクは解除されません。 フェールオーバー後もリンクは維持され、可用性グループと分散型可用性グループはアクティブなままとなります。 これ以外の操作は必要ありません。

リンクを削除すると、分散型可用性グループのみが削除され、可用性グループはアクティブなままとなります。 可用性グループを保持するか、削除するかを決定できます。

可用性グループを削除する場合は、次の値を置き換えてからサンプルの T-SQL コードを実行します。

  • <AGName> は SQL Server の可用性グループの名前に (リンクの作成に使用される)。
-- Run on SQL Server
USE MASTER
GO
DROP AVAILABILITY GROUP <AGName> 
GO

強制フェールオーバー後の一貫性のない状態

強制フェールオーバー後、両方のレプリカがプライマリ ロールに存在するスプリット ブレイン シナリオが発生し、リンクが不整合な状態のままになる場合があります。 これは、障害発生時にセカンダリ レプリカにフェールオーバーした後、プライマリ レプリカがオンラインに戻った場合に発生する可能性があります。

まず、スプリット ブレイン シナリオに陥っているかを確認します。 これには、SQL Server Management Studio (SSMS) または Transact-SQL (T-SQL) を使用します。

SSMS で SQL Server と SQL Managed Instance の両方に接続し、オブジェクト エクスプローラーで、[Always On 高可用性][可用性グループ] ノードの下にある [可用性レプリカ] を展開します。 2 つの異なるレプリカが (プライマリ) としてリストされている場合は、スプリット ブレイン シナリオに陥っている状態です。

または、SQL Server と SQL Managed Instance の両方で、次の T-SQL スクリプトを実行して、レプリカのロールを確認することもできます。

-- Execute on SQL Server and SQL Managed Instance 

declare @link_name varchar(max) = '<DAGName>' 
USE MASTER 
GO

SELECT
   ag.name [Link name], 
   rs.role_desc [Link role] 
FROM
   sys.availability_groups ag 
   join sys.dm_hadr_availability_replica_states rs 
   on ag.group_id = rs.group_id 
WHERE 
   rs.is_local = 1 and ag.name = @link_name 
GO

両方のインスタンスで [Link role] 列に異なるプライマリがリストされている場合は、スプリット ブレイン シナリオに陥っている状態です。

スプリット ブレイン状態を解決するには、まず元のプライマリレプリカのバックアップを作成します。 元のプライマリが SQL Server の場合は、ログ末尾のバックアップを実行します。 元のプライマリが SQL Managed Instance の場合は、コピーのみの完全バックアップを実行します。 バックアップが完了したら、以前は元のプライマリだったが、新しいセカンダリになるレプリカのセカンダリ ロールに分散型可用性グループを設定します。

たとえば、実際の障害が発生した場合、SQL Server ワークロードを Azure SQL Managed Instance に強制フェールオーバーし、SQL Managed Instance でワークロードを実行し続ける場合は、SQL Server でログ末尾のバックアップを実行し、次の例のように、SQL Server のセカンダリ ロールに分散可用性グループを設定します。

--Execute on SQL Server 
USE MASTER

ALTER availability group [<DAGName>] 
SET (role = secondary) 
GO 

次に、以下の例のようにリンクを使用して、SQL Managed Instance から SQL Server への計画的な手動フェールオーバーを実行します。

--Execute on SQL Managed Instance 
USE MASTER

ALTER availability group [<DAGName>] FAILOVER 
GO 

リンク機能の詳細については、以下のリソースを確認してください。