レプリケーションおよびデータベース ミラーリング

データベース ミラーリングを使用して、特定のレプリケーション データベースの可用性を向上できます。トランザクション レプリケーションとデータベース ミラーリングの組み合わせがサポートされるかどうかは、検討されているレプリケーション データベースによります。ピア ツー ピア レプリケーションとデータベース ミラーリングの組み合わせはサポートされていません。データベース ミラーリングの詳細については、「データベース ミラーリングの管理」を参照してください。

次の表に、レプリケーション データベースと、対応するミラーリングのサポートのレベルを示します。

レプリケーション データベース

データベース ミラーリングとの併用がサポートされるかどうか

パブリケーション

はい。

自動フェールオーバーを使用するマージ レプリケーションとトランザクション レプリケーションの両方でサポートされます。パブリケーション データベースに接続するレプリケーション エージェントは、ミラー化されたパブリケーション データベースに自動的にフェールオーバーできます。エラーが発生すると、パブリケーション データベースに接続するレプリケーション エージェントは、新しいプリンシパル データベースに自動的に再接続します。

ディストリビューション

いいえ。

ディストリビューション データベースのミラーリングはサポートされていません。ディストリビューション データベースは、レプリケーション構成が格納される場所であり、構成メタデータは、ディストリビューターが構成されているサーバーの名前と緊密に結び付けられています。ミラー化されたデータベースへのフェールオーバー時にサーバー名は変更されますが、ディストリビューション データベースに格納されている構成データは、古いディストリビューション データベース サーバーを指しています。

サブスクリプション

はい。

SQL Server 2008 以降、手動でのフェールオーバーと構成を使用するトランザクション レプリケーションでサポートされます。サブスクリプション データベースに接続するレプリケーション エージェントは、ミラーリングに対応していません。プリンシパル サブスクリプション データベースでエラーが発生した場合、セカンダリ データベースにフェールオーバーするには、いくつかの手動の手順を実行して、レプリケーションのストリームを復元する必要があります。詳細については、「SQL Server のレプリケーション: データベース ミラーリングを使用した項可用性の実現」(SQL Server の技術資料) を参照してください。

レプリケーションを再構成することなく、ディストリビューション データベースおよびサブスクリプション データベースを復旧する場合の詳細については、「レプリケートされたデータベースのバックアップと復元」を参照してください。

注意

フェールオーバー後には、ミラーがプリンシパルになります。このトピックでは、"プリンシパル" および "ミラー" という言葉は常に、元のプリンシパルとミラーを表します。

レプリケーションとデータベース ミラーリングを併用する場合の要件および注意事項

レプリケーションとデータベース ミラーリングを併用する場合、以下の要件および考慮事項に注意してください。

  • プリンシパルとミラーはディストリビューターを共有する必要があります。このディストリビューターにはリモート ディストリビューターを使用することをお勧めします。こうすることによって、パブリッシャーに予定外のフェールオーバーが発生した場合のフォールト トレランスが向上します。

  • パブリッシャーおよびディストリビューターは Microsoft SQL Server 2005 以降のバージョンである必要があります。サブスクライバーには任意のバージョンを使用できますが、SQL Server 2005 より前のバージョンによるマージ レプリケーションのプル サブスクリプションではフェールオーバーがサポートされません。この場合、エージェントがサブスクライバーで実行され、以前のバージョンのエージェントがミラーを認識できないためです。データベースがミラーからプリンシパルにフェールバックされると、このようなサブスクライバーに対するレプリケーションが再開されます。

  • マージ レプリケーション、および読み取り専用サブスクライバーまたはキュー更新サブスクライバーを使用するトランザクション レプリケーションでは、パブリケーション データベースのミラーリングがサポートされます。即時更新サブスクライバー、Oracle パブリッシャー、ピア ツー ピア トポロジのパブリッシャー、およびリパブリッシャーはサポートされません。

  • ログイン、ジョブ、リンク サーバーなど、データベースの外部に存在するメタデータやオブジェクトはミラーにコピーされません。これらのメタデータやオブジェクトをミラーで必要とする場合、手動でコピーする必要があります。詳細については、「役割の交代後のログインとジョブの管理 (SQL Server)」を参照してください。

データベース ミラーリングを使用するレプリケーションの構成

レプリケーションとデータベース ミラーリングの構成には、以下の 5 つの手順があります。各手順の詳細については、以下のセクションで説明します。

  1. パブリッシャーを構成します。

  2. データベース ミラーリングを構成します。

  3. プリンシパルと同じディストリビューターを使用するようにミラーを構成します。

  4. フェールオーバー用にレプリケーション エージェントを構成します。

  5. プリンシパルおよびミラーをレプリケーション モニターに追加します。

手順 1. と手順 2. の実行順序は逆にすることもできます。

パブリケーション データベースのデータベース ミラーリングを構成するには

  1. パブリッシャーを構成します。

    1. リモート ディストリビューターの使用をお勧めします。ディストリビューションの構成の詳細については、「ディストリビューションの構成」を参照してください。

    2. スナップショット パブリケーション、トランザクション パブリケーション、およびマージ パブリケーションのデータベースを有効化できます。複数の種類のパブリケーションを含むミラー データベースの場合、同一ノード上で sp_replicationdboption を使用し、両方の種類のパブリケーションに対してデータベースを有効化する必要があります。たとえば、以下のストアド プロシージャの呼び出しをプリンシパルで実行できます。

      exec sp_replicationdboption @dbname='<PublicationDatabase>', @optname='publish', @value=true
      exec sp_replicationdboption @dbname='<PublicationDatabase>', @optname='mergepublish', @value=true
      
      exec sp_replicationdboption @dbname='<PublicationDatabase>', @optname='publish', @value=true
      exec sp_replicationdboption @dbname='<PublicationDatabase>', @optname='mergepublish', @value=true
      

      パブリケーションの作成の詳細については、「データとデータベース オブジェクトのパブリッシュ」を参照してください。

  2. データベース ミラーリングを構成します。詳細については、「データベース ミラーリング セッションを構成する方法 (SQL Server Management Studio)」および「データベース ミラーリングの設定」を参照してください。

  3. ディストリビューションをミラー用に構成します。ミラー名をパブリッシャーとして指定し、プリンシパルと同一のディストリビューターおよびスナップショット フォルダーを指定します。たとえば、ストアド プロシージャを使用してレプリケーションを構成する場合、ディストリビューターで sp_adddistpublisher を実行し、次にミラーで sp_adddistributor を実行します。sp_adddistpublisher の場合は、以下の手順を実行します。

    • @publisher パラメーターの値にミラーのネットワーク名を設定します。

    • @working_directory パラメーターの値にプリンシパルで使用するスナップショット フォルダーを設定します。

  4. –PublisherFailoverPartner エージェント パラメーターの値にミラー名を指定します。フェールオーバーの後、以下のエージェントでミラーを特定する場合にこのエージェント パラメーターが必要になります。

    • スナップショット エージェント (すべてのパブリケーション用)

    • ログ リーダー エージェント (すべてのトランザクション パブリケーション用)

    • キュー リーダー エージェント (キュー更新サブスクリプションをサポートするトランザクション パブリケーション用)

    • マージ エージェント (マージ サブスクリプション用)

    • SQL Server レプリケーション リスナー (replisapi.dll : Web 同期を使用して同期したマージ サブスクリプション用)

    • SQL マージ ActiveX コントロール (このコントロールを使用して同期したマージ サブスクリプション用)

    ディストリビューション エージェントおよびディストリビューション ActiveX コントロールはパブリッシャーに接続しないため、このパラメーターがありません。

    エージェント パラメーターの変更は、エージェントを次に起動したときに有効になります。エージェントを連続実行する場合は、いったん停止してから再起動する必要があります。パラメーターは、エージェント プロファイルおよびコマンド プロンプトで指定できます。詳細については、次のトピックを参照してください。

    –PublisherFailoverPartner をエージェント プロファイルに追加して、プロファイルにミラー名を指定することをお勧めします。たとえば、ストアド プロシージャを使用してレプリケーションを構成する場合、以下のように指定します。

    -- Execute sp_help_agent_profile in the context of the distribution database to get the list of profiles.
    -- Select the profile id of the profile that needs to be updated from the result set.
    -- In the agent_type column returned by sp_help_agent_profile: 
    -- 1 = Snapshot Agent; 2 = Log Reader Agent; 3 = Distribution Agent; 4 = Merge Agent; 9 = Queue Reader Agent.
    
    exec sp_help_agent_profile
    
    -- Setting the -PublisherFailoverPartner parameter in the default Snapshot Agent profile (profile 1).
    -- Execute sp_add_agent_parameter in the context of the distribution database.
    exec sp_add_agent_parameter @profile_id = 1, @parameter_name = N'-PublisherFailoverPartner', @parameter_value = N'<Failover Partner Name>'
    
    -- Setting the -PublisherFailoverPartner parameter in the default Merge Agent profile (profile 6).
    -- Execute sp_add_agent_parameter in the context of the distribution database.
    exec sp_add_agent_parameter @profile_id = 6, @parameter_name = N'-PublisherFailoverPartner', @parameter_value = N'<Failover Partner Name>'
    
    -- Execute sp_help_agent_profile in the context of the distribution database to get the list of profiles.
    -- Select the profile id of the profile that needs to be updated from the result set.
    -- In the agent_type column returned by sp_help_agent_profile: 
    -- 1 = Snapshot Agent; 2 = Log Reader Agent; 3 = Distribution Agent; 4 = Merge Agent; 9 = Queue Reader Agent.
    
    exec sp_help_agent_profile
    
    -- Setting the -PublisherFailoverPartner parameter in the default Snapshot Agent profile (profile 1).
    -- Execute sp_add_agent_parameter in the context of the distribution database.
    exec sp_add_agent_parameter @profile_id = 1, @parameter_name = N'-PublisherFailoverPartner', @parameter_value = N'<Failover Partner Name>'
    
    -- Setting the -PublisherFailoverPartner parameter in the default Merge Agent profile (profile 6).
    -- Execute sp_add_agent_parameter in the context of the distribution database.
    exec sp_add_agent_parameter @profile_id = 6, @parameter_name = N'-PublisherFailoverPartner', @parameter_value = N'<Failover Partner Name>'
    
  5. プリンシパルおよびミラーをレプリケーション モニターに追加します。詳細については、「レプリケーション モニタのパブリッシャを追加および削除する方法 (レプリケーション モニタ)」を参照してください。

ミラー化したパブリケーション データベースのメンテナンス

ミラー化したパブリケーション データベースのメンテナンスは、ミラー化していないデータベースの場合と基本的に同じです。ただし、以下の点に注意する必要があります。

  • アクティブなサーバーで管理および監視を行う必要があります。SQL Server Management Studio では、アクティブなサーバーだけで、[ローカル パブリケーション] フォルダー以下にパブリケーションが表示されます。たとえば、ミラーへのフェールオーバーが発生した場合、パブリケーションがミラーで表示され、プリンシパルでは表示されなくなります。データベースでミラーへのフェールオーバーが発生した場合、Management Studio およびレプリケーション モニターを手動で更新して、変更を反映することが必要になる場合もあります。

  • レプリケーション モニターでは、プリンシパルとミラーの両方に対するオブジェクト ツリー内にパブリッシャー ノードが表示されます。プリンシパルがアクティブなサーバーの場合、パブリケーション情報はレプリケーション モニターのプリンシパル ノード以下のみに表示されます。

    ミラーがアクティブなサーバーの場合は、次のように表示されます。

    • エージェントでエラーが発生している場合、エラーはプリンシパル ノードでのみ示され、ミラー ノードでは示されません。

    • プリンシパルが使用不可の場合、プリンシパル ノードとミラー ノードで、パブリケーションの同一の一覧が表示されます。監視は、ミラー ノードのパブリケーションで実行する必要があります。

  • ストアド プロシージャまたはレプリケーション管理オブジェクト (RMO) を使用して、ミラーでレプリケーションを管理する場合、パブリッシャー名を指定する際にはレプリケーションを有効にしたデータベースが使用するインスタンス名を指定する必要があります。適切な名前を決定するには、publishingservername 関数を使用します。

    パブリケーション データベースをミラー化した場合、ミラー データベースに格納されるレプリケーション メタデータとプリンシパル データベースに格納されるメタデータが同一になります。その結果、プリンシパルでレプリケーションが有効なパブリケーション データベースでは、ミラーのシステム テーブルに格納されるパブリッシャーのインスタンス名は、ミラーではなくプリンシパルの名前になります。これにより、パブリケーション データベースでミラーへのフェールオーバーが発生した場合のレプリケーションの構成およびメンテナンスが影響を受けます。たとえば、フェールオーバーの後、ストアド プロシージャを使用してレプリケーションを構成し、プリンシパルで有効化されたパブリケーション データベースにプル サブスクリプションを追加する場合、sp_addpullsubscription または sp_addmergepullsubscription@publisher パラメーターにミラー名ではなくプリンシパル名を指定する必要があります。

    ミラーへのフェールオーバーの後、ミラーでパブリケーション データベースを有効化する場合、システム テーブルに格納されるパブリッシャーのインスタンス名はミラー名となります。この場合、@publisher パラメーターにはミラー名を指定します。

    注意

    sp_addpublication などを使用する場合、SQL Server 以外のパブリッシャーに対してのみ @publisher パラメーターがサポートされます。このような場合、SQL Server のデータベース ミラーリングとは無関係になります。

  • フェールオーバーの後、Management Studio でサブスクリプションを同期するには、サブスクライバーからプル サブスクリプションを同期し、アクティブなパブリッシャーからプッシュ サブスクリプションを同期します。

ミラーリングを解除した場合のレプリケーションの動作

パブリッシュされたデータベースからデータベース ミラーリングを解除する場合は、以下の点に注意してください。

  • プリンシパルでパブリケーション データベースが既にミラー化されていない場合、元のプリンシパルに対するレプリケーションはそのまま動作します。

  • パブリケーション データベースでプリンシパルからミラーへのフェールオーバーが発生した後、ミラーリング リレーションシップを無効化または解除した場合、レプリケーション エージェントがミラーに対して機能しなくなります。プリンシパルが完全に失われた場合、ミラーのレプリケーションをいったん無効化し、その後パブリッシャーとして再構成します。

  • データベース ミラーリングを完全に解除した場合、ミラー データベースが復旧状態になるため、動作させるためには復元を行う必要があります。復旧したデータベースでレプリケーションがどのように動作するかは、KEEP_REPLICATION オプションを指定したかどうかによって異なります。このオプションを指定すると、パブリッシュされたデータベースをバックアップが作成されたサーバーと異なるサーバーに復元する場合に、復元操作でレプリケーションの設定が強制的に保存されます。他のパブリケーション データベースが使用できない場合にのみ、KEEP_REPLICATION オプションを指定してください。他のパブリケーション データベースが稼働中でレプリケーションを実行中の場合、このオプションはサポートされません。KEEP_REPLICATION の詳細については、「RESTORE (Transact-SQL)」を参照してください。

ログ リーダー エージェントの動作

データベース ミラーリングのさまざまな動作モードに対するログ リーダー エージェントの動作を次の表に示します。動作モードの詳細については、「Transact-SQL の設定とデータベース ミラーリングの動作モード」を参照してください。

動作モード

ミラーが使用できない場合のログ リーダー エージェントの動作

自動フェールオーバーを伴う高い安全性モード

ミラーが使用できない場合、ログ リーダー エージェントはコマンドをディストリビューション データベースに反映します。ミラーがオンラインに戻り、プリンシパルからすべてのトランザクションを受け取るまで、プリンシパルからミラーへのフェールオーバーは発生しません。

高パフォーマンス モード

ミラーが使用できない場合、プリンシパル データベースは無防備な (つまり、ミラー化されていない) 状態で稼働していることになります。ただし、ログ リーダー エージェントはミラーで保存されたトランザクションのみをレプリケートします。サービスが強制され、ミラー サーバーがプリンシパルとしての役割を回復すると、ログ リーダー エージェントがミラーに対して機能し、新しいトランザクションの取得を開始します。詳細については、「強制的なサービスの起動 (データ損失の可能性あり)」を参照してください。

ミラーがプリンシパルより遅れた場合、レプリケーションの待機時間が増大することに注意してください。

自動フェールオーバーを伴わない高い安全性モード

コミット済みのすべてのトランザクションがミラーのディスクに保存されることが保証されます。ログ リーダー エージェントはミラーで保存されたトランザクションのみをレプリケートします。ミラーが使用できない場合、プリンシパルのデータベースが停止します。そのため、ログ リーダー エージェントがレプリケートするトランザクションがなくなります。