sql >> データベース >  >> RDS >> Sqlserver

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

    データベースレプリケーションは、プライマリサーバーからセカンダリサーバーにデータを配布するテクノロジです。レプリケーションは、マスターデータベースが1つまたは複数のスレーブサーバーにデータを配布するマスタースレーブの概念で機能します。レプリケーションは、同じサーバー上の複数のSQL Serverインスタンス間で設定することも、同じまたは地理的に離れたデータセンター内の複数のデータベースサーバー間で設定することもできます。
    SQLServerレプリケーションを使用する主な利点は2つあります。

    1. レプリケーションを使用すると、レポートの目的で使用できるほぼリアルタイムのデータを取得できます。たとえば、あるサーバーでの書き込み集約型のOLTP負荷と別のサーバーでの読み取り集約型の負荷を分離する場合、両方のサーバーでデータの同期を維持するようにレプリケーションを設定できます。
    2. 2番目の利点は、特定の時間に実行されるようにレプリケーションをスケジュールできることです。たとえば、レポートサーバーに完了日のデータを含める場合は、それに応じてレプリケーションスナップショットをスケジュールできます。現在のデータを処理するために追加のロジックを作成する必要はありません。

    レプリケーションには多くの柔軟性があります。レプリケーションを使用すると、行を除外したり、任意のテーブルのデータのサブセットをレプリケートしたりできます。複製されたデータを変更することも、更新と挿入のみを複製して削除を無視することもできます。 Oracleなどの別のデータベースシステムからデータを複製することもできます。

    レプリケーションのコンポーネント

    SQLServerレプリケーションには7つのコアコンポーネントがあります。リストは次のとおりです。

    1. 発行者。
    2. ディストリビューター。
    3. サブスクライバー。
    4. 記事。
    5. 出版物。
    6. サブスクリプションをプッシュします。
    7. プルサブスクリプション。

    詳細は次のとおりです。

    記事

    アーティクルは、SQLテーブルなどのデータベースオブジェクト、またはストアドプロシージャです。前述したように、レプリケーションを使用すると、データをフィルタリングしたり、選択したテーブル列をレプリケートしたりできるため、テーブルの列または行は記事と見なされます。

    出版物

    記事は、出版物の一部になるまで複製できません。 Publicationは、Articles/Databaseオブジェクトのグループです。また、SQLServerによって複製されるデータセットも表します。

    発行者

    Publisherには、公開する必要のあるデータを含むマスターデータベースが含まれています。すべての加入者にどのデータを配布するかを決定します。

    ディストリビューター

    ディストリビューターは、パブリッシャーとサブスクライバーの間の架け橋です。 Distributerは、公開されたすべてのデータを収集し、すべてのサブスクライバーに送信するまでそれを保持します。これは、パブリッシャーとサブスクライバーの間の架け橋です。複数のパブリッシャーとサブスクライバーの概念をサポートします。別のSQLインスタンスまたは別のサーバーでディストリビューターを構成する必要はありません。構成しない場合、発行者はディストリビューターとして機能できます。大規模なレプリケーションを行っている組織は、別のシステムでディストリビューターを構成できます。

    サブスクライバー

    サブスクライバーは、データまたは複製されたパブリケーションが送信される送信元または宛先の終わりです。レプリケーションでは、パブリッシャーは1つで、複数のサブスクライバーを持つことができます。

    プッシュサブスクリプション

    プッシュサブスクリプションでは、パブリッシャーはサブスクライバーにデータを更新します。プッシュサブスクリプションでは、サブスクライバーはパッシブです。出版社は、すべての購読者に記事または出版物を送信します。組織の要件に基づいて、レプリケーションウィザードの作成時に、画面で使用するサブスクリプションを選択できます。トランザクションレプリケーションとピアツーピアレプリケーションは、プッシュサブスクリプションを使用して、データのリアルタイムの可用性を維持します。

    プルサブスクリプション

    プルサブスクリプションでは、すべてのサブスクライバーがパブリッシャーに新しいデータまたは更新されたデータを要求します。プルサブスクリプションでは、サブスクライバーに必要なデータまたはデータ変更を制御できます。変更したデータをすぐに必要としない場合に便利です。

    レプリケーションタイプ

    SQL Serverは、次の3つのレプリケーションタイプをサポートしています。

    1. トランザクションレプリケーション。
    2. スナップショットレプリケーション。
    3. レプリケーションをマージします。

    トランザクションレプリケーション

    トランザクションレプリケーション、スキーマの変更、パブリッシャーデータベースで発生したデータ変更は、サブスクライバーデータベースにレプリケートされます。パブリッシャーデータベースで更新、削除、または挿入操作が発生するたびに、変更が追跡され、それらの変更がサブスクライバーデータベースに送信されます。トランザクションレプリケーションは、ネットワークを介して限られた量のデータのみを送信します。さらに、変更はほぼリアルタイムであるため、DRサイトのセットアップに使用したり、レポート操作のスケールアウトに使用したりできます。トランザクションレプリケーションは、次の状況に最適です。

    1. パブリッシャーで行われた変更をサブスクライバーにすぐに適用するシステムをセットアップする場合。
    2. パブリッシャーには、INSERT、UPDATES、およびDELETESがあります。
    3. 異種レプリケーションの意味を設定する場合は、Oracleなどの非SQLServerデータベースのパブリッシャーまたはサブスクライバー。

    パブリッシャーデータベースに変更が加えられると、変更はパブリッシャーデータベースのログファイルに記録されます。ディストリビューター/パブリッシャーサイト、2つのジョブが作成されます。

    1. スナップショットエージェント :スナップショットエージェントジョブは、スキーマのスナップショット、複製または公開するオブジェクトのデータを生成します。スナップショットのファイルは、パブリッシャーサーバーまたはネットワーク上の場所に保存できます。レプリケーションを初めて開始すると、スナップショットが作成され、すべてのサブスクライバーに適用されます。スナップショットエージェントは、手動でトリガーされるか、特定の時間に実行するようにスケジュールされるまで、アイドル状態のままです。
    2. ログリーダーエージェント :ログリーダーエージェントジョブは継続的に実行されます。パブリッシャーデータベースのトランザクションログから発生した変更(INSERT、UPDATES、およびDELETES)を読み取り、配布エージェントに送信します。
    3. 配布エージェント :ログリーダーエージェントから変更が取得されると、配布エージェントはすべての変更をサブスクライバーに送信します。

    トランザクションレプリケーションを構成すると、次のアクティビティが実行されます

    • パブリケーションデータとデータベースオブジェクトの最初のスナップショットと、サブスクライバーに適用されたスナップショットを取得することから開始します。
    • ログリーダーエージェントは、パブリッシャーのT-Logを継続的に監視し、変更が発生した場合は、ディストリビューターまたはサブスクライバーに直接送信します。

    次の画像は、トランザクションレプリケーションがどのように機能するかを表しています。

    利点:

    1. トランザクションレプリケーションは、スタンバイSQLサーバーとして使用することも、負荷分散またはレポートシステムとOLTPシステムの分離に使用することもできます。
    2. パブリッシャーサーバーは、低遅延でサブスクライバーサーバーにデータを複製します。
    3. トランザクションレプリケーションを使用すると、オブジェクトレベルのレプリケーションを実装できます。
    4. 保護するデータが少なく、迅速なデータ回復計画が必要な場合は、トランザクションレプリケーションを適用できます。

    短所:

    1. レプリケーションが確立されると、パブリッシャーでのスキーマの変更はサブスクライバーサーバーには適用されません。新しいスナップショットを生成してサブスクライバーに適用することにより、これらの変更を手動で行う必要があります。
    2. サーバーを変更する場合は、レプリケーションを再構成する必要があります。
    3. トランザクションレプリケーションをDRセットアップとして使用する場合は、手動でフェイルオーバーする必要があります。

    スナップショットレプリケーション

    スナップショットレプリケーションは、定義されたスケジュールでパブリケーションの完全な画像/スナップショットを生成し、サブスクライバーにスナップショットファイルを送信します。スナップショットレプリケーションが発生すると、宛先データは新しいスナップショットに置き換えられます。スナップショットレプリケーションは、データの揮発性が低い場合に最適なオプションです。たとえば、City、Zipcode、Pincodeなどのマスターテーブルは、スナップショットレプリケーションの最適な候補です。

    スナップショットレプリケーションの構成中に、次の重要なコンポーネントが定義されます。

    1. スナップショットエージェント :パブリケーションで定義されたスキーマとデータの完全なイメージを作成し、ディストリビューターに送信します。スナップショットエージェントは、手動でトリガーされるか、特定の時間に実行するようにスケジュールされるまで、アイドル状態のままです。
    2. ディストリビューターエージェント :スナップショットファイルをサブスクライバーに送信し、既存のものを置き換えることでスキーマとデータを適用します。

    スナップショットレプリケーションは、次のアクティビティを実行します。

    1. 定義されたスケジュールで、スナップショットエージェントは公開するスキーマとデータに共有ロックを設定します。
    2. ディストリビューター側にコピーされた公開データのスナップショット全体。スナップショットエージェントは3つのファイルを作成します
      • 公開されたデータの作成されたデータベーススキーマへのファイル。
      • SQLテーブル内のデータをエクスポートするためのBCPファイル
      • インデックスデータをエクスポートするためのインデックスファイル。
    1. ファイルが作成されると、スナップショットエージェントは公開されたデータとデータの共有ロックを解放します。
    2. ディストリビューターエージェントは、スナップショットエージェントによって作成されたファイルを使用して、サブスクライバースキーマとデータを開始および置換します。

    次の画像は、スナップショットレプリケーションがどのように機能するかを示しています。

    利点

    1. スナップショットレプリケーションの設定は非常に簡単です。データが頻繁に変更されない場合は、スナップショットレプリケーションが非常に適したオプションです。
    2. データを送信するタイミングを制御できます。たとえば、大量のデータがあるが、トラフィックが少ないときにデータを複製できるよりも頻繁に変更されないマスターテーブル。

    短所

    1. スナップショットエージェントによって生成されたスナップショットには、変更および変更されていない公開データが含まれているため、ネットワーク経由で送信されるスナップショットは遅延を引き起こし、他の操作に影響を与える可能性があります。
    2. データが増えると、スナップショットのサイズが大きくなり、スナップショットを作成してサブスクライバーに配布するのに時間がかかります。

    マージレプリケーション

    マージレプリケーションは、複数のサーバーで変更を管理する必要があり、これらの変更を統合する必要がある場合に使用できます。

    マージレプリケーションを構成すると、次のコンポーネントが作成されます。

    1. スナップショットエージェント :スナップショットエージェントは、パブリケーションデータとデータベースオブジェクトの最初のスナップショットを生成します。スナップショットが作成されると、すべてのサブスクライバーに配布されます。
    2. マージエージェント :マージエージェントは、パブリッシャーとサブスクライバーの間の競合を解決する責任があります。競合は、競合解決を使用するマージエージェントを介して解決されます。競合解決の構成方法に応じて、競合はマージエージェントによって解決されます。

    マージレプリケーションを構成すると、次のアクティビティが実行されます。

    • パブリケーションデータとデータベースオブジェクトのスナップショット、およびサブスクライバーに適用されたスナップショットを取得することから開始します。
    • マージレプリケーションを構成しているときに、パブリッシャーとサブスクライバーにトリガーが作成されます。トリガーは、パブリッシャーとサブスクライバーのその後の変更とテーブルの変更を追跡する責任があります。
    • パブリッシャーとサブスクライバーがネットワークに接続すると、データ行の変更とスキーマの変更が相互に同期されます。パブリッシャーとサブスクライバーの変更をマージしている間、マージエージェントは、マージエージェントで定義された条件に基づいて競合を解決します。

    マージレプリケーションはサーバーからクライアントへの環境で使用され、サブスクライバーがパブリッシャーからデータを取得し、オフラインで変更を加えてから、パブリッシャーや他のサブスクライバーと変更を同期する必要がある状況に最適です。

    同じ行が異なるパブリッシャーとサブスクライバーによって変更される実際的な状況が存在する可能性があります。その時点で、Mergeエージェントは定義されている競合解決を確認し、それに応じて変更を加えます。

    SQL Serverは、公開されたテーブルの各行に対してグローバル一意識別子を使用して列を一意に識別します。テーブルにすでに一意の識別子列がある場合、SQLServerは自動的にその列を使用します。それ以外の場合は、テーブルにrowguid列を追加し、その列に基づいてインデックスを作成します。

    トリガーは、パブリッシャーとサブスクライバーの両方の公開されたテーブルに作成されます。これらは、行または列の変更に基づいて変更を追跡するために使用されます。

    次の画像は、マージレプリケーションがどのように機能するかを示しています。

    利点:

    1. これは、複数のサーバーデータの変更を統合するための唯一の方法です。

    短所:

    1. 両端を複製して同期するには、かなりの時間がかかります。
    2. 多くの関係者を同期させる必要があるため、一貫性が低くなります。
    3. 同じ行が複数のサブスクライバーとパブリッシャーで影響を受ける場合、レプリケーションのマージ中に競合が発生する可能性があります。競合解決を使用して修正できますが、レプリケーションのセットアップがより複雑になります。

    レプリケーション構成を確認するためのT-SQLコード

    マシンの2つのインスタンスでスナップショットレプリケーションとトランザクションレプリケーションを構成しました。 SQL動的管理(DMV)を使用して、レプリケーションの構成を確認できます。レプリケーションの構成を確認するには、T-SQLコードを使用できます。スクリプトコードは次のように入力されます:

    1. サブスクライバーデータベース名。
    2. 発行者名。
    3. サブスクリプションタイプ。
    4. パブリッシャーデータベース。
    5. レプリケーションエージェント名。

    以下はスクリプトです:

    SELECT DistributionAgent.subscriber_db 
           [Subscriber DB], 
           DistributionAgent.publication                              [PUB Name], 
           RIGHT(LEFT(DistributionAgent.NAME, Len(DistributionAgent.NAME) - ( Len( 
                                                    DistributionAgent.id) + 1 )), 
           Len(LEFT( 
           DistributionAgent.NAME, Len(DistributionAgent.NAME) - 
                                   ( 
                                                        Len( 
           DistributionAgent.id) + 1 ))) - ( 
           10 + Len(DistributionAgent.publisher_db) + ( 
           CASE 
           WHEN 
           DistributionAgent.publisher_db = 'ALL' 
                                               THEN 1 
           ELSE 
                                                 Len( 
           DistributionAgent.publication) + 2 
              END ) ))              [SUBSCRIBER], 
           ( CASE 
               WHEN DistributionAgent.subscription_type = '0' THEN 'Push' 
               WHEN DistributionAgent.subscription_type = '1' THEN 'Pull' 
               WHEN DistributionAgent.subscription_type = '2' THEN 'Anonymous' 
               ELSE Cast(DistributionAgent.subscription_type AS VARCHAR) 
             END ) 
           [Subscrition Type], 
           DistributionAgent.publisher_db + ' - ' 
           + Cast(DistributionAgent.publisher_database_id AS VARCHAR) 
           [Publisher Database], 
           DistributionAgent.NAME 
           [Pub - DB - Publication - SUB - AgentID] 
    FROM   distribution.dbo.msdistribution_agents DistributionAgent 
    WHERE  DistributionAgent.subscriber_db <> 'virtual'

    出力は次のとおりです。

    概要

    この記事では、次のことを説明しました:

    1. レプリケーションとそのコンポーネントの基本と利点。
    2. トランザクションレプリケーション。
    3. スナップショットレプリケーション。
    4. レプリケーションをマージします。

    1. OracleUNIONおよびORDERBYに関する奇妙な問題

    2. データベースのトランザクションログがいっぱいです

    3. MySQLドロップインデックス

    4. MySQLで日付に日を追加する方法