リンクのフェールオーバー - Azure SQL Managed Instance
適用対象: Azure SQL Managed Instance
この記事では、ディザスター リカバリーや移行を目的として SQL Server Management Studio (SSMS) または PowerShell を使用し、SQL Server と Azure SQL Managed Instance 間でリンクされたデータベースをフェールオーバーする方法を説明します。
前提条件
リンクを通じてデータベースをセカンダリ レプリカにフェールオーバーするには、次の前提条件を満たす必要があります。
- 有効な Azure サブスクリプション アカウントがない場合は、無料アカウントを作成してください。
- 必要なサービス更新プログラムがインストールされている SQL Server のサポート対象バージョン。
- リンク がプライマリ レプリカとセカンダリ レプリカの間で構成されます。
- リンクをフェールオーバーするには、SQL Server 2022 CU13 (KB5036432) 以降の Transact-SQL を使用します。
ワークロードを停止する
データベースをセカンダリ レプリカにフェールオーバーする準備ができたら、まず、メンテナンス時間中にプライマリ レプリカ上のアプリケーション ワークロードを停止します。 これにより、データベース レプリケーションがセカンダリに追いつくことができるため、データを失うことなくセカンダリにフェールオーバーできます。 フェールオーバーする前に、アプリケーションがプライマリにトランザクションをコミットしていないことを確認します。
データベースのフェールオーバー
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
関連するコンテンツ
リンクの使用については、以下を参照してください。
- Managed Instance リンク用に環境を準備する
- SSMS を使用して SQL Server と SQL Managed Instance の間のリンクを構成する
- スクリプトを使用して SQL Server と SQL Managed Instance の間のリンクを構成する
- リンクを使用して移行する
- リンクを維持するためのベスト プラクティス
リンクの詳細については、以下を参照してください。
他のレプリケーション シナリオについては、以下を検討してください。