レプリケーション要素の定義
クラシック・レプリケーション・スキームは、1つ以上のELEMENT
記述で構成されます。ELEMENT記述には、要素の名前、そのタイプ(DATASTORE
、TABLE
またはSEQUENCE
)、更新が行われるマスター・データベース、更新がレプリケートされるサブスクライバ・データベースが含まれます。
ノート:
キャッシュ・グループがあるデータベースをレプリケートする場合は、「キャッシュ・グループがあるアクティブ・スタンバイ・ペアの管理」を参照してください。
要素の制限は、次のとおりです。
-
特定のオブジェクト(表、順序またはデータベース)を複数の要素記述に含めないでください。
-
マスターおよびプロパゲータの両方の役割に同じ要素を定義しないでください。
-
要素には、現在のホスト上のデータベースがマスター、サブスクライバまたはプロパゲータのいずれかとして含まれている必要があります。
-
要素名は、レプリケーション・スキーム内で一意である必要があります。
複数サブスクライバ・スキームで要素を定義するための正しい方法については、「複数サブスクライバのクラシック・レプリケーション・スキーム」を参照してください。要素を伝播するための正しい方法については、「伝播スキーム」を参照してください。
後でALTER REPLICATION
文を使用して要素の削除または変更を行う場合は、スキーム内の各要素の名前を使用して要素を識別できます。
既存のレプリケーション・スキームに表、順序およびデータベースを追加できます。クラシック・レプリケーション・スキームの変更を参照してください。レプリケーション・スキームから表または順序を除外した後に、そのレプリケーション・スキームの一部であるデータベースから表または順序を削除できます。「クラシック・レプリケーション・スキームからの表または順序の削除」を参照してください。
この項の後半では、次の内容について説明します。
DATASTORE要素の定義
DATASTORE
要素を定義することで、マスター・データベースの内容全体をサブスクライバにレプリケートできます。
マスター・データベース(masterds
)のすべての内容をサブスクライバ・データベース(subscriberds
)にレプリケートする場合、ELEMENT
記述(ds1
)は次のようになります。
ELEMENT ds1 DATASTORE MASTER masterds ON "system1" SUBSCRIBER subscriberds ON "system2"
データベース・ホストは、hostname
オペレーティング・システム・コマンドから返されるホスト名で識別してください。ホスト名は二重引用符で囲むことをお薦めします。
ノート:
一時データベースはレプリケートできません。
CREATE REPLICATION
文のEXCLUDE TABLE
句およびEXCLUDE SEQUENCE
句を使用すると、DATASTORE
要素からの特定の表および順序の除外を選択できます。EXCLUDE
句を使用すると、EXCLUDE
句で指定されたオブジェクトを除くデータベース全体が、要素内のすべてのサブスクライバにレプリケートされます。1つの要素記述で使用できるEXCLUDE TABLE
句およびEXCLUDE SEQUENCE
句はそれぞれ1つのみです。たとえば、この要素記述では2つの表および1つの順序が除外されます。
ELEMENT ds1 DATASTORE MASTER masterds ON "system1" SUBSCRIBER subscriberds ON "system2" EXCLUDE TABLE ttuser.tab1, ttuser.tab2 EXCLUDE SEQUENCE ttuser.seq1
CREATE REPLICATION
文のINCLUDE TABLE
句およびINCLUDE SEQUENCE
句を使用すると、データベースへの特定の表および順序のみの挿入を選択できます。INCLUDE
句を使用すると、INCLUDE
句で指定されたオブジェクトのみが、要素内の各サブスクライバにレプリケートされます。1つの要素記述で使用できるINCLUDE TABLE
句およびINCLUDE SEQUENCE
句はそれぞれ1つのみです。たとえば、この要素記述では1つの表および2つの順序が挿入されます。
ELEMENT ds1 DATASTORE MASTER masterds ON "system1" SUBSCRIBER subscriberds ON "system2" INCLUDE TABLE ttuser.tab3 INCLUDE SEQUENCE ttuser.seq2, ttuser.seq3
表要素の定義
マスター・データベースからサブスクライバ・データベースに表をレプリケートできます。
表ttuser.tab1
およびttuser.tab2
を、(masterds
という名前でホストsystem1
に配置されている)マスター・データベースから、(subscriberds
という名前でホストsystem2
に配置されている)サブスクライバ・データベースにレプリケートする場合、ELEMENT
記述(名前はa
およびb
)は次のようになります。
ELEMENT a TABLE ttuser.tab1 MASTER masterds ON "system1" SUBSCRIBER subscriberds ON "system2" ELEMENT b TABLE ttuser.tab2 MASTER masterds ON "system1" SUBSCRIBER subscriberds ON "system2"
クラシック・レプリケーション・スキームでの表の要件については、「クラシック・レプリケーション・スキームの制限事項および表要件」を参照してください。
クラシック・レプリケーション・スキーム内の外部キーで関連付けられている表のレプリケート
クラシック・レプリケーション・スキームでは、外部キーで互いに関連付けられている表は、すべての表をレプリケートするか一部の表のみをレプリケートするかを選択できます。
これを行うには、各マスターおよびサブスクライバに、表および外部キー関係を作成します。その後、各マスターおよびサブスクライバでALTER REPLICATION ADD ELEMENT
文を使用して、表をレプリケーション・スキームに追加します。
ただし、外部キー関係がON DELETE CASCADE
を使用して構成されている場合は、すべての表をレプリケーション・スキームを作成する前に作成する必要があります。その後、CREATE REPLICATION
文を使用してすべての表を含むようにレプリケーション・スキームを構成しますが、その際、DATASTORE
要素(どの表も除外しない)、または関連付けられているすべての表に対してTABLE
要素のいずれかを使用します。
ALTER REPLICATION
文を使用してレプリケーション・スキームを作成した後に、ON DELETE CASCADE
で構成された外部キーで関連付けられている表をレプリケーション・スキームに追加することはできません。かわりに、レプリケーション・スキームを削除し、ON DELETE CASCADE
で構成された外部キーで関連付けられている新しい表を作成してから、関連するすべての表を含む新しいレプリケーション・スキームを作成します。
ON DELETE CASCADE
で構成された外部キーを持つ表をレプリケートする場合は、サブスクライバ上の対応する外部キーもON DELETE CASCADE
で構成されている必要があります。また、その表に対して外部キーで関連付けられている他のすべての表もレプリケートする必要があります。この要件によって、マスター・データベースでカスケード削除を実行した場合にサブスクライバ表で競合が発生しなくなります。
TimesTen Classicでは、カスケード削除が単一の操作としてレプリケートされ、親表で行が削除された場合に子表で発生する個々の行削除はサブスクライバにレプリケートされません。そのため、親表で削除された外部キーの値を含む行がサブスクライバ・データベースの子表に存在する場合は、その行がマスター・データベースの子表に存在していなかった場合でも削除されます。
順序のレプリケート
順序は、レプリケーション・スキームから除外したり、CYCLE
属性が指定されていないかぎり、レプリケートされます。
順序のレプリケーションは、アクティブ・データベースで順序が更新されるたびに、スタンバイ・データベースで順序番号の範囲を予約することによって最適化されます。順序番号の範囲を予約すると、トランザクション・ログの更新回数を減らすことができます。順序番号の範囲はキャッシュと呼ばれます。アクティブ・データベースでの順序の更新のレプリケートは、順序の更新後にレプリケート・トランザクションが実行される場合、または順序の更新がレプリケート・トランザクションで使用される場合にのみ実行されます。
MINVALUE
が1で、INCREMENT
が1、デフォルトのCache
が20の順序my.seq
について考えてみます。my.seq.NEXTVAL
を初めて使用すると、マスター・データベースの順序の現在値は2に変更され、新しい現在値21(20+1)がサブスクライバにレプリケートされます。マスター・データベースのmy.seq.NEXTVAL
への次の19回の参照では、サブスクライバ・データベースの現在値21がマスターの現在値より大きいため、新しい現在値のレプリケートは行われません。my.seq.NEXTVAL
への21回目の参照では、前回レプリケートされたサブスクライバの現在値21が、この時点でマスターの現在値22より小さくなるため、新しい現在値41(21+20)がサブスクライバ・データベースに送信されます。
順序のレプリケーションには、次の制限があります。
-
CYCLE
属性が指定された順序はレプリケートできません。 -
レプリケートされる順序の定義は、各ピア・データベースで同じである必要があります。
-
順序では、競合の検出は実行されません。
RETURN TWOSAFE
サービスを使用せずに、双方向レプリケーション構成で両方のデータベースの順序を更新すると、両方の順序によって同じNEXTVAL
が返される可能性があります。
いずれかのピアで更新が行われる双方向レプリケーション・スキームで順序を使用する必要がある場合は、競合を回避するために、各データベースで、異なるMINVALUE
およびMAXVALUE
属性が指定された、レプリケートされない順序をかわりに使用できます。たとえば、MINVALUE
が1でMAXVALUE
が100の順序my.seq
をデータベースDS1
に作成し、MINVALUE
が101でMAXVALUE
が200の同じ順序をDS2
に作成するとします。この場合、DS1
およびDS2
を双方向レプリケーション・スキームで構成すると、順序my.seq
を使用して、いずれのデータベースに対しても順序値が競合しないことを保証して更新を行うことができます。この構成でttRepAdmin
-duplicate
を使用して障害からリカバリする場合は、複製操作を実行した後で順序を削除し、新しいMINVALUE
およびMAXVALUE
を指定して順序を再作成する必要があることに注意してください。
SELECT my.seq.NEXTVAL FROM sys.dual
などの順序に対する操作では、順序値は増加しますが、レプリケートされる表でのトランザクションをその後に行うまでレプリケートは実行されません。この動作には、レプリケートされる表でのトランザクションをその後に行うまでこれらの順序の更新がログからパージされないという副作用があります。このため、これらの順序の更新のみがログの末尾に存在する場合は、ttRepSubscriberWait
およびttRepAdmin
-wait
で障害が発生します。
順序ttuser.seq
を、(masterds
という名前でホストsystem1
に配置されている)マスター・データベースから、(subscriberds
という名前でホストsystem2
に配置されている)サブスクライバ・データベースにレプリケートする場合、要素記述(名前はa
)は次のようになります。
ELEMENT a SEQUENCE ttuser.seq MASTER masterds ON "system1" SUBSCRIBER subscriberds ON "system2"
レプリケートされたデータベースでのビューおよびマテリアライズド・ビュー
マテリアライズド・ビューは、ディテール表と呼ばれる1つ以上のTimesTen表から選択されたデータのサマリーです。マテリアライズド・ビューは直接レプリケートできませんが、マテリアライズド・ビューの基礎となるディテール表は通常のTimesTen表の場合と同じ方法でレプリケートできます。
マスター・データベースおよびサブスクライバ・データベースのディテール表は、マテリアライズド・ビューで参照できます。ただし、TimesTen Classicレプリケーションでは、レプリケート対象のディテール表の構造がマスターおよびサブスクライバの両方で同じかどうかのみが検証されます。マテリアライズド・ビューが各データベースで同じである必要はありません。
マテリアライズド・ビューまたは非マテリアライズド・ビューがDATASTORE
要素として含まれているデータベース全体をレプリケートする場合は、ビューに関連付けられているディテール表のみがレプリケートされます。ビュー自体はレプリケートされません。一致するビューは、サブスクライバ・データベースで定義できますが、必須ではありません。ディテール表がレプリケートされると、TimesTen Classicはそれに対応するビューを自動的に更新します。
マテリアライズド・ビューが更新されたときに、オーバーフローまたはアンダーフロー状態が発生するように指定されている場合、レプリケート対象の表に定義されたマテリアライズド・ビューで、レプリケーション障害または非一貫性が発生する場合があります。