Always On 可用性グループの計画的な手動フェールオーバーの実行 (SQL Server)

適用対象:SQL Server

このトピックでは、SQL Server の SQL Server Management Studio、Transact-SQL、または PowerShell を使用して、Always On 可用性グループ上でデータを失わずに手動フェールオーバー (計画的な手動フェールオーバー) を実行する方法について説明します。 可用性グループは、可用性レプリカのレベルでフェールオーバーします。 Always On 可用性グループのフェールオーバーのように、計画的な手動フェールオーバーではセカンダリ レプリカがプライマリ ロールに移行します。 同時に、フェールオーバーによって元のプライマリ レプリカがセカンダリ ロールに移行します。

計画的な手動フェールオーバーは、プライマリ レプリカおよびターゲット セカンダリ レプリカが同期コミット モードで動作していて、現在同期されている場合にのみサポートされます。 計画的な手動フェールオーバーでは、ターゲット セカンダリ レプリカの可用性グループに参加しているセカンダリ データベース内のすべてのデータが維持されます。 プライマリ レプリカがセカンダリ ロールに移行すると、そのデータベースがセカンダリ データベースになります。 次に、新しいプライマリ データベースとの同期が開始されます。 すべてが SYNCHRONIZED 状態に移行した後は、新しいセカンダリ レプリカが、将来の計画的な手動フェールオーバーのターゲットとして機能できるようになります。

注意

セカンダリ レプリカとプライマリ レプリカの両方に対して自動フェールオーバー モードを構成し、セカンダリ レプリカを同期すると、自動フェールオーバーのターゲットとしても機能できるようになります。 詳細については、「可用性モード (Always On 可用性グループ)」を参照してください。

始める前に

重要

クラスター マネージャーを使わないで読み取りスケール可用性グループをフェールオーバーするには、固有の手順があります。 可用性グループで CLUSTER_TYPE = NONE が設定されている場合は、「読み取りスケール可用性グループのプライマリ レプリカをフェールオーバーする」の手順に従ってください。

制限事項と制約事項

  • フェールオーバー コマンドは、ターゲットのセカンダリ レプリカがコマンドを受け入れた直後に戻ります。 ただし、データベースの復旧は、可用性グループがフェールオーバーを完了した後に非同期で行われます。

  • フェールオーバー時に、可用性グループ内のデータベース間の一貫性が維持されない場合があります。

    注意

    複数のデータベースにまたがるトランザクションと分散トランザクションのサポートは、SQL Server とオペレーティング システムのバージョンによって異なります。 詳細については、Always On 可用性グループとデータベース ミラーリングでのデータベース間のトランザクションと分散トランザクション (SQL Server) に関するページを参照してください。

前提条件と制限

  • ターゲットのセカンダリ レプリカとプライマリ レプリカは、両方とも同期コミット可用性モードで実行されている必要があります。

  • 現在、ターゲットのセカンダリ レプリカはプライマリ レプリカと同期されている必要があります。 このセカンダリ レプリカのすべてのセカンダリ データベースが可用性グループに参加している必要があります。 これらは対応するプライマリ データベースとも同期されている必要があります (つまり、ローカルのセカンダリ データベースが同期されている必要があります)。

    ヒント

    セカンダリ レプリカのフェールオーバーの準備状態を調べるには、sys.dm_hadr_database_replica_cluster_states 動的管理ビューで is_failover_ready 列をクエリします。 または、Always On グループ ダッシュボード[フェールオーバーの準備] 列を確認します。

  • このタスクは、ターゲット セカンダリ レプリカ上でのみサポートされます。 ターゲット セカンダリ レプリカをホストするサーバー インスタンスに接続されている必要があります。

セキュリティ

アクセス許可

可用性グループに ALTER AVAILABILITY GROUP のアクセス許可が必要です。 CONTROL AVAILABILITY GROUP アクセス許可、ALTER ANY AVAILABILITY GROUP アクセス許可、または CONTROL SERVER アクセス許可も必要です。

SQL Server Management Studio の使用 [SQL Server]

可用性グループで手動フェールオーバーを行うには:

  1. オブジェクト エクスプローラーで、フェールオーバーを行う必要がある可用性グループのセカンダリ レプリカをホストするサーバー インスタンスに接続します。 サーバー ツリーを展開します。

  2. [AlwaysOn 高可用性] ノードと [可用性グループ] ノードを展開します。

  3. フェールオーバーする [可用性グループ] ノードを右クリックし、 [フェールオーバー] を選択します。

  4. 可用性グループのフェールオーバー ウィザードが開始されます。 詳細については、「可用性グループのフェールオーバー ウィザードの使用 (SQL Server Management Studio)」を参照してください。

Transact-SQL の使用

可用性グループで手動フェールオーバーを行うには:

  1. ターゲット セカンダリ レプリカをホストするサーバー インスタンスに接続します。

  2. ALTER AVAILABILITY GROUP ステートメントを使用します。次にその例を示します。

    ALTER AVAILABILITY GROUP group_name FAILOVER

    ステートメントの group_name は可用性グループの名前です。

    次の例では、接続されているセカンダリ レプリカに MyAg 可用性グループを手動でフェールオーバーします。

    ALTER AVAILABILITY GROUP MyAg FAILOVER;  
    

PowerShell の使用

可用性グループで手動フェールオーバーを行うには:

  1. ディレクトリ変更コマンド (cd) を使用して、ターゲット セカンダリ レプリカをホストするサーバー インスタンスに移動します。

  2. Switch-SqlAvailabilityGroup コマンドレットを使用します。

    注意

    コマンドレットの構文を表示するには、 PowerShell 環境で Get-Help SQL Server コマンドレットを使用します。 詳細については、「SQL Server PowerShell のヘルプの参照」を参照してください。

    次の例では、指定したパスのセカンダリ レプリカに MyAg 可用性グループを手動でフェールオーバーします。

    Switch-SqlAvailabilityGroup -Path SQLSERVER:\Sql\SecondaryServer\InstanceName\AvailabilityGroups\MyAg  
    

    SQL Server PowerShell プロバイダーを設定して使用するには:

フォロー アップ: 可用性グループの手動フェールオーバーを実行した後

可用性グループの 自動フェールオーバー セット の外側でフェールオーバーした場合、Windows Server フェールオーバー クラスタリング ノードのクォーラム投票を調整して新しい可用性グループの構成を反映します。 詳細については、「Windows Server フェールオーバー クラスタリング (WSFC) と SQL Server」を参照してください。

読み取りスケール可用性グループのプライマリ レプリカをフェールオーバーする

各可用性グループにはプライマリ レプリカが 1 つだけあります。 プライマリ レプリカは読み書きができます。 プライマリになっているレプリカの変更は、フェールオーバーで行うことができます。 一般的な可用性グループでは、クラスター マネージャーによってフェールオーバー プロセスが自動化されます。 クラスターの種類が NONE の可用性グループでは、フェールオーバー プロセスは手動です。

クラスターの種類が NONE の可用性グループでプライマリ レプリカをフェールオーバーするには、2 つの方法があります。

  • データ損失のない手動フェールオーバー
  • データ損失のある強制的な手動フェールオーバー

データ損失のない手動フェールオーバー

プライマリ レプリカを使用できても、プライマリ レプリカをホストするインスタンスを一時的または永続的に変更する必要がある場合は、この方法を使用します。 データ損失の可能性を排除するため、手動フェールオーバーを実行する前にターゲット セカンダリ レプリカが最新の状態であることを確認します。

データ損失のない手動フェールオーバーを行うには:

  1. 現在のプライマリおよびターゲット セカンダリ レプリカを SYNCHRONOUS_COMMIT とします。

    ALTER AVAILABILITY GROUP [AGRScale] 
         MODIFY REPLICA ON N'<node2>' 
         WITH (AVAILABILITY_MODE = SYNCHRONOUS_COMMIT);
    
  2. アクティブなトランザクションが、プライマリ レプリカと少なくとも 1 つの同期セカンダリ レプリカにコミットされていることを確認するために、次のクエリを実行します。

    SELECT ag.name, 
       drs.database_id, 
       drs.group_id, 
       drs.replica_id, 
       drs.synchronization_state_desc, 
       ag.sequence_number
    FROM sys.dm_hadr_database_replica_states drs, sys.availability_groups ag
    WHERE drs.group_id = ag.group_id; 
    

    synchronization_state_descSYNCHRONIZED の場合、セカンダリ レプリカは同期されています。

  3. REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT を 1 に更新します。

    次の例のスクリプトは、ag1 という名前の可用性グループで REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT を 1 に設定します。 次のスクリプトを実行する前に、ag1 を実際の可用性グループの名前に置き換えます。

    ALTER AVAILABILITY GROUP [AGRScale] 
         SET (REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT = 1);
    

    この設定により、すべてのアクティブなトランザクションが、プライマリ レプリカと少なくとも 1 つの同期セカンダリ レプリカにコミットされます。

    注意

    この設定は、フェールオーバーに固有のものではなく、環境の要件に基づいて設定する必要があります。

  4. ロールの変更に備えて、フェールオーバーに参加していないプライマリ レプリカとセカンダリ レプリカをオフラインに設定します。

    ALTER AVAILABILITY GROUP [AGRScale] OFFLINE
    
  5. ターゲット セカンダリ レプリカをプライマリに昇格させます。

    ALTER AVAILABILITY GROUP AGRScale FORCE_FAILOVER_ALLOW_DATA_LOSS; 
    
  6. 以前のプライマリとその他のセカンダリのロールを SECONDARY に更新し、以前のプライマリ レプリカをホストする SQL Server インスタンスで次のコマンドを実行します。

    ALTER AVAILABILITY GROUP [AGRScale] 
         SET (ROLE = SECONDARY); 
    

    注意

    可用性グループを削除するには、DROP AVAILABILITY GROUP を使います。 種類が NONE または EXTERNAL のクラスターを使って作成された可用性グループでは、可用性グループに含まれるすべてのレプリカでコマンドを実行する必要があります。

  7. データ移動を再開し、プライマリ レプリカがホストされている SQL Server インスタンス上の可用性グループ内のすべてのデータベースに対して、次のコマンドを実行します。

    ALTER DATABASE [db1]
         SET HADR RESUME
    
  8. 読み取りスケールの目的で作成した、クラスター マネージャーでは管理されないリスナーをすべて再作成します。 元のリスナーが以前のプライマリを指している場合、それを削除して、新しいプライマリを指すように再作成します。

データ損失のある強制的な手動フェールオーバー

プライマリ レプリカが利用できず、復旧をすぐに行えない場合は、データ損失を伴うセカンダリ レプリカへのフェールオーバーを強制的に実行する必要があります。 ただし、フェールオーバー後に元のプライマリ レプリカが回復した場合は、それによってプライマリの役割が引き継がれます。 各レプリカが異なる状態になるのを回避するには、データ損失を伴う強制フェールオーバー後に、可用性グループから元のプライマリを削除します。 元のプライマリがオンラインに戻ったら、その中の可用性グループ全体を削除します。

プライマリ レプリカ N1 からセカンダリ レプリカ N2 へのデータ損失を伴う手動フェールオーバーを強制的に実行するには、次の手順を行います。

  1. セカンダリ レプリカ (N2) で、強制フェールオーバーを開始します。

    ALTER AVAILABILITY GROUP [AGRScale] FORCE_FAILOVER_ALLOW_DATA_LOSS;
    
  2. 新しいプライマリ レプリカ (N2) 上で、元のプライマリ (N1) を削除します。

    ALTER AVAILABILITY GROUP [AGRScale]
    REMOVE REPLICA ON N'N1';
    
  3. すべてのアプリケーション トラフィックがリスナーまたは新しいプライマリ レプリカに向けられていることを確認します。

  4. 元のプライマリ (N1) がオンラインになった場合は、直ちに、元のプライマリ (N1) 上で可用性グループ AGRScale をオフラインにします。

    ALTER AVAILABILITY GROUP [AGRScale] OFFLINE
    
  5. データまたは同期されていない変更がある場合は、ビジネス ニーズに合わせてバックアップまたはその他のデータ レプリケート オプションを使用して、そのデータを保存します。

  6. 次に、元のプライマリ (N1) から可用性グループを削除します。

    DROP AVAILABILITY GROUP [AGRScale];
    
  7. 元のプライマリ レプリカ (N1) 上の可用性グループ データベースを削除します。

    USE [master]
    GO
    DROP DATABASE [AGDBRScale]
    GO
    
  8. (省略可能) 必要に応じて、N1 を新しいセカンダリ レプリカとして可用性グループ AGRScale に追加できるようになりました。

関連項目