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

データベース ミラーリングとレプリケーションを組み合わせて使用すると、パブリケーション データベースに対して可用性を提供することができます。データベース ミラーリングでは単一データベースの 2 つのコピーを使用します。通常、これらのコピーは異なるコンピュータに配置されます。クライアントが任意の時点において使用できるデータベースのコピーは 1 つだけです。このコピーはプリンシパル データベースと呼ばれます。クライアントがプリンシパル データベースに対して加えた更新は、ミラー データベースと呼ばれるもう一方のコピー データベースに適用されます。プリンシパル データベースに対して行われた挿入、更新、および削除はすべてトランザクション ログに記録され、ミラーリングによってこのトランザクション ログがミラー データベースに適用されます。

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

注意注意

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

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

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

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

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

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

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

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

レプリケーションとデータベース ミラーリングの構成には、以下の 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
      

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

  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>'
    
  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 の設定とデータベース ミラーリングの動作モード」を参照してください。

動作モード

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

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

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

高パフォーマンス モード

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

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

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

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