クラシック・レプリケーション・スキームの構文の例

この項の例では、様々なクラシック・レプリケーション・スキームの構成方法を示します。

単一クラシック・サブスクライバ・スキーム

次の例では、クラシック・レプリケーション・スキーム内の単一の表をレプリケートします。この例は、単一のマスターおよびサブスクライバの単方向レプリケーション・スキームを示しています。

2つのデータベースが別々のホストsystem1およびsystem2に配置されています。RETURN RECEIPTサービスを使用して、マスター・データベースのttuser.tab表に対してコミットしたすべてのトランザクションがサブスクライバで受信されることを確認します。

CREATE REPLICATION repscheme
 ELEMENT e TABLE ttuser.tab
    MASTER masterds ON "system1"
    SUBSCRIBER subscriberds ON "system2"
      RETURN RECEIPT;

次の例では、データベース全体をレプリケートします。示されているスキームは、単一のマスターおよびサブスクライバの単方向レプリケーション・スキームです。2つのデータベースが別々のホストserver1およびserver2に配置されています。マスター・データベースmasterdsは、そのすべての内容をサブスクライバ・データベースsubscriberdsにレプリケートします。

CREATE REPLICATION repscheme
 ELEMENT e DATASTORE
    MASTER masterds ON "server1"
    SUBSCRIBER subscriberds ON "server2";

複数サブスクライバのクラシック・レプリケーション・スキーム

最大255のサブスクライバ・データベースを含むクラシック・レプリケーション・スキームを作成できます。プロパゲータ・データベースを構成する場合は、最大255のプロパゲータを構成できます。各プロパゲータには最大255のサブスクライバ・データベースを構成できます。

プロパゲータ・データベースを使用するクラシック・レプリケーション・スキームの例は、「伝播スキーム」を参照してください。

この例では、2つのサブスクライバにレプリケートします。この例では、server2にあるsubscriber1dsおよびserver3にあるsubscriber2dsという2つのサブスクライバ・データベースにttuser.tab表をレプリケートするマスター・データベースmasterdsを設定します。クラシック・レプリケーション・スキームの名前はtwosubscribersです。レプリケーション要素の名前はeです。

CREATE REPLICATION twosubscribers
 ELEMENT e TABLE ttuser.tab
    MASTER masterds ON "server1"
    SUBSCRIBER subscriber1ds ON "server2",
               subscriber2ds ON "server3";

この例では、RETURN RECEIPT属性およびSTOREパラメータを使用して、2つのサブスクライバにレプリケートします。RETURN RECEIPTで、両方のデータベースに対するRETURN RECEIPTサービスを有効にします。STOREパラメータで、FAILTHRESHOLD値を10に設定し、サブスクライバで障害が発生したとみなされるまでmasterdsに累積可能な、サブスクライバに対するトランザクション・ログ・ファイルの最大数を指定します。

CREATE REPLICATION twosubscribers
 ELEMENT e TABLE ttuser.tab
  MASTER masterds ON "server1"
  SUBSCRIBER subscriber1ds ON "server2",
             subscriber2ds ON "server3"
  RETURN RECEIPT
 STORE masterds FAILTHRESHOLD 10;

この例では、subscriber2dsという1つのサブスクライバに対してのみRETURN RECEIPTを有効にします。subscriber1ds定義の末尾のカンマは不要です。

CREATE REPLICATION twosubscribers
 ELEMENT e TABLE ttuser.tab
    MASTER masterds ON "server1"
    SUBSCRIBER subscriber1ds ON "server2"
    SUBSCRIBER subscriber2ds ON "server3" RETURN RECEIPT
 STORE masterds FAILTHRESHOLD 10;

この例は、サブスクライバに対して異なるRETURNサービスを有効にする方法を示しています。この例では、RETURN RECEIPT BY REQUESTsubscriber1dsに、RETURN RECEIPTsubscriber2dsに適用します。このクラシック・レプリケーション・スキームでは、subscriber1dsにアクセスするアプリケーションは、ttRepSyncSetプロシージャを使用して、トランザクションに対してRETURNサービスを有効にする必要があります。一方、subscriber2dsは無条件に、すべてのトランザクションに対してRETURNサービスを提供します。

CREATE REPLICATION twosubscribers
 ELEMENT e TABLE ttuser.tab
    MASTER masterds ON "server1"
    SUBSCRIBER subscriberds1 ON "server2" RETURN RECEIPT BY REQUEST
    SUBSCRIBER subscriber2ds ON "server3" RETURN RECEIPT
 STORE masterds FAILTHRESHOLD 10;

異なる複数のサブスクライバへの表のレプリケーション

クラシック・レプリケーション・スキームは、4つの表をレプリケートするcentraldsという名前のマスター・データベースを設定します。ttuser.tab1およびttuser.tab2は、サブスクライバbackup1dsにレプリケートされます。ttuser.tab3およびttuser.tab4は、backup2dsにレプリケートされます。マスター・データベースはfinanceサーバーにあります。両方のサブスクライバがサーバーbackupsystemに配置されています。

CREATE REPLICATION twobackups
 ELEMENT a TABLE ttuser.tab1
  MASTER centralds ON "finance"
  SUBSCRIBER backup1ds ON "backupsystem"
 ELEMENT b TABLE ttuser.tab2
  MASTER centralds ON "finance"
  SUBSCRIBER backup1ds ON "backupsystem"
 ELEMENT d TABLE ttuser.tab3
  MASTER centralds ON "finance"
  SUBSCRIBER backup2ds ON "backupsystem"
 ELEMENT d TABLE ttuser.tab4
  MASTER centralds ON "finance"
  SUBSCRIBER backup2ds ON "backupsystem";

伝播スキーム

マスター・データベースによって表に対する更新がプロパゲータに送信され、プロパゲータによってその変更内容が2つのサブスクライバに転送されます。

マスター・データベースはホストfinancecentraldsです。プロパゲータ・データベースはホストnethandlerpropdsです。サブスクライバは、backupsystem1backup1dsおよびbackupsystem2backup2dsです。

クラシック・レプリケーション・スキームには2つの要素があります。要素aでは、centraldstab表に対する変更がプロパゲータ・データベースpropdsにレプリケートされます。要素bでは、propdsで受信したtab表への変更が2つのサブスクライバbackup1dsおよびbackup2dsにレプリケートされます。

CREATE REPLICATION propagator
 ELEMENT a TABLE ttuser.tab
  MASTER centralds ON "finance"
  SUBSCRIBER propds ON "nethandler"
 ELEMENT b TABLE ttuser.tab
  PROPAGATOR propds ON "nethandler"
  SUBSCRIBER backup1ds ON "backupsystem1",
             backup2ds ON "backupsystem2";

双方向の分割ワークロード・スキーム

例では、westcoastホストのwestdsおよびeastcoastホストのeastdsという2つのデータベースがあります。顧客は2つの表で表され、西地区の顧客のデータはwaccounts、東地区の顧客のデータはeaccountsに収められます。westdsデータベースは、waccounts表を更新してeastdsデータベースにレプリケートします。eaccounts表は、eastdsデータベースによって所有され、westdsデータベースにレプリケートされます。RETURN RECEIPT属性は、RETURN RECEIPTサービスを有効にして、いずれのマスター表のトランザクションもそれらのサブスクライバによって受信されることを保証します。

CREATE REPLICATION r1
 ELEMENT elem_waccounts TABLE ttuser.waccounts
  MASTER westds ON "westcoast"
  SUBSCRIBER eastds ON "eastcoast" RETURN RECEIPT
 ELEMENT elem_eaccounts TABLE ttuser.eaccounts
  MASTER eastds ON "eastcoast"
  SUBSCRIBER westds ON "westcoast" RETURN RECEIPT;

双方向の分散ワークロード・スキーム

eastdsまたはwestdsのいずれかのデータベースでttuser.accounts表を更新できる一般ワークロードの双方向クラシック・レプリケーション・スキーム。各データベースは、accounts表に対してマスターおよびサブスクライバの両方になります。

ノート:

RETURN TWOSAFE戻りサービスを構成して双方向の分散ワークロード・レプリケーション・スキームを使用しないでください。

CREATE REPLICATION r1
 ELEMENT elem_accounts_1 TABLE ttuser.accounts
  MASTER westds ON "westcoast"
  SUBSCRIBER eastds ON "eastcoast"
 ELEMENT elem_accounts_2 TABLE ttuser.accounts
  MASTER eastds ON "eastcoast"
  SUBSCRIBER westds ON "westcoast";

要素をこの手法でレプリケートする場合、アプリケーションでは、各データベースへの書込みを調整して、同じデータに同時に更新が行われないようにする必要があります。更新競合を管理するには、BINARY(8)型のタイムスタンプ列をレプリケート表に含め、CREATE REPLICATION文にCHECK CONFLICTS句を含めてタイムスタンプ比較を有効にします。レプリケーション競合の解消を参照してください。

次の例は、更新競合を管理する方法を示しています。tstampタイムスタンプ列は、ttuser.accounts表に含まれています。CREATE REPLICATION文は、CHECK CONFLICTS句が含まれるように変更されています。

CREATE TABLE ttuser.accounts (custname VARCHAR2(30) NOT NULL,
                       address VARCHAR2(80),
                       curbalance DEC(15,2),
                       tstamp BINARY(8),
                       PRIMARY KEY (custname));

CREATE REPLICATION r1
 ELEMENT elem_accounts_1 TABLE ttuser.accounts
  CHECK CONFLICTS BY ROW TIMESTAMP
    COLUMN tstamp
    UPDATE BY SYSTEM
    ON EXCEPTION ROLLBACK WORK
  MASTER westds ON "westcoast"
  SUBSCRIBER eastds ON "eastcoast"
 ELEMENT elem_accounts_2 TABLE ttuser.accounts
  CHECK CONFLICTS BY ROW TIMESTAMP
    COLUMN tstamp
    UPDATE BY SYSTEM
    ON EXCEPTION ROLLBACK WORK
  MASTER eastds ON "eastcoast"
  SUBSCRIBER westds ON "westcoast";