処理のための表の準備

Db2 LUWのOracle GoldenGate環境で使用するために表を準備するには、次のタスクを実行する必要があります。


トリガーおよびカスケード制約の無効化

ターゲットのDb2 LUW表で、トリガー、カスケード削除制約、およびカスケード更新制約を無効化します。Oracle GoldenGateは、トリガーまたはカスケード制約の結果生じるDMLをレプリケートします。同じトリガーまたは制約がターゲット表で有効にされる場合、レプリケートされたバージョンが原因で冗長になり、データベースによってエラーが返されます。次の例について考えてみます。この場合、ソース表はemp_srcおよびsalary_src、ターゲット表はemp_targおよびsalary_targです。

  1. emp_srcに削除が発行されます。

  2. それによって、削除がsalary_srcにカスケードされます。

  3. Oracle GoldenGateが、両方の削除をターゲットに送信します。

  4. 親削除が最初に到達し、emp_targに適用されます。

  5. 親削除は、削除をsalary_targにカスケードします。

  6. salary_srcのカスケード削除が、salary_targに適用されます。

  7. この行は、すでにステップ5で削除されているため、配置できません。

表における行の一意性の保証

Oracle GoldenGateでは、レプリケートされた更新および削除に対応する正しいターゲット行を検出するために、ソース表およびターゲット表でいくつかの一意の行識別子が必要です。

TABLE文またはMAP文でKEYCOLS句が使用されないかぎり、Oracle GoldenGateは、使用する行識別子を次の優先順位で選択します。

  1. 主キー

  2. タイムスタンプまたはマテリアライズされていない計算結果列を含まない英数字順に最初の一意キー。

  3. 前述のキー・タイプのいずれも存在しない場合(他の種類のキーが表に定義されている可能性はあります)、Oracle GoldenGateでは、データベースで一意のキー内での使用が許可されているすべての行の擬似キーが作成されますデータベースでは、キー内でのOracle GoldenGateでサポートされていないもの、またはOracle GoldenGate構成から除外されているものを除き、一意のキーでの使用が許可されます。

    ノート:表に対して他の使用不可なキーが存在する場合、または表にキーがまったくない場合、Oracle GoldenGateは該当するメッセージをレポート・ファイルに記録します。すべての列からキーを作成すると、ソース・システムでのOracle GoldenGateのパフォーマンスが低下します。ターゲットでは、このキーがReplicatであまり効率的でないより大きいWHERE句が使用される原因となります。

  4. 表に適切なキーがない場合、あるいは既存のキーを使用しない場合は、表に一意の値が常に含まれる列があれば、代替キーを定義できます。この代替キーは、ExtractのTABLEパラメータおよびReplicatのMAPパラメータ内にKEYCOLS句を含めることで定義します。指定されたキーにより、Oracle GoldenGateで検出される既存の主キーまたは一意キーがオーバーライドされます。Oracle GoldenGateパラメータおよび機能リファレンスのTABLE \| MAPを参照してください。

KEYCOLSを使用したカスタム・キーの指定

表に前述のタイプの行IDのいずれかがない場合や、それらの識別子を使用しないほうがよい場合、表に常に一意の値を含む列があるときは、代替キーを定義できます。この代替キーは、ExtractのTABLEパラメータおよびReplicatのMAPパラメータ内にKEYCOLS句を含めることで定義します。指定されたキーにより、Oracle GoldenGateで検出される既存の主キーまたは一意キーがオーバーライドされます。

キー変更の防止

Oracle GoldenGateで表のデータの抽出が開始された後で、キーに列を追加しないでください。このルールは、主キー、一意キー、KEYCOLSキー、またはすべての列キーに適用されます。Db2 LUWでは、表に追加される列の変更前イメージは提供されません。ソースでキー内の列が更新された場合、Oracle GoldenGateでは更新のレプリケートに際、ターゲット表の現在の値と比較するために前イメージが必要になります。

マテリアライズ問合せ表の維持

ソースとターゲットのマテリアライズ問合せ表(MQT)間の同等性を維持するには、ベース表をレプリケートしますが、MQTはレプリケートしません。ターゲット・データベースでは、Replicatがベース表に適用する変更に基づいてMQTが維持されています。

これらの表を構成するためのルールを次に示します。

テンポラル表の作成

テンポラル表とは、表データの履歴と有効期間を管理する表です。Oracle GoldenGateでは、テンポラル表を使用して、表内で削除または更新される古い行すべてを管理します。テンポラル表は、その行やデータのビジネス有効期間を管理する場合にも使用されます。たとえば、Oracle GoldenGateでは行の有効期間を管理します。テンポラル表には、システム期間、アプリケーション期間、およびバイテンポラル表の3種類があります。

テンポラル表への変換

既存の表をテンポラル表に変換できますが、それにより表の構造が変更されます。この項では、表の構造がどのように変更されるかについて説明します。次のサンプル既存の表は、この項の例で3種類すべてのテンポラル表タイプに変換されます。

Table policy_info
(
Policy_id char[4] not null primary key,
Coverage int not null
              )
And the tables contains the following initial rows
                   POLICY_ID       COVERAGE
                   -------------        -----------
                     ABC                12000
                     DEF                 13000
                     ERT                 14000

例1既存表をシステム期間テンポラル表に変換

サンプルの既存表をシステム期間テンポラル表に変換するには、次のようにSYSTEM_PERIOD列、transaction id列およびSYSTEM_TIME期間を追加します。

ALTER TABLE policy_info
   ADD COLUMN sys_start TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW BEGIN;
ALTER TABLE policy_info
   ADD COLUMN sys_end TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW END;
ALTER TABLE policy_info
   ADD COLUMN ts_id TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS TRANSACTION START ID;
ALTER TABLE policy_info ADD PERIOD SYSTEM_TIME(sys_start, sys_end);

次に、次のいずれかの方法を使用して新しいテンポラル表の履歴表を作成します。

    CREATE TABLE hist_policy_info
(
 policy_id     CHAR(4) NOT NULL,

coverage     INT NOT NULL,
sys_start    TIMESTAMP(12) NOT NULL ,

sys_end      TIMESTAMP(12) NOT NULL,

ts_id            TIMESTAMP(12) NOT NULL

           );
 ALTER TABLE hist_policy_info ADD RESTRICT ON DROP;
CREATE TABLE hist_policy_info LIKE policy_info with RESTRICT ON DROP;

RESTRICT ON DROP句を使用すると、システム期間テンポラル表の削除中に履歴表は削除できません。それ以外は、関連するテンポラル表の削除中に履歴表が暗黙的に削除されます。RESTRICT ON DROP.を使用せずに履歴表を作成できます。履歴表は明示的に削除できません。

履歴表の作成時にはGENERATED ALWAYS句を使用しないようにしてください。また、ベース表の特定の行に対して多数の更新が行われ、それにより同じ主キーのセットで履歴表に何件もの挿入がトリガーされる場合があるため、システム期間テンポラル表の主キーもここでは適用されません。これ以外にも、履歴表の構造は関連するシステム期間テンポラル表とまったく同じであることが必要です。履歴表にはシステム期間テンポラル表と同数の列を同じ順序で設定する必要があります。履歴表の列は明示的に追加、削除または変更できません。次の文を使用して、システム期間テンポラル表をその履歴表と関連付ける必要があります。

ALTER TABLE policy_info ADD VERSIONING USE HISTORY TABLE hist_policy_info.

表のGENERATED ALWAYS列は、常にデータベース・マネージャによって移入される列であり、ユーザーがこれらの列を制御することはできません。データベース・マネージャは、システム時間に基づいてこれらの列に移入します。

既存の行では、追加されたSYSTEM_PERIOD列とtransaction id列に、次のようなデフォルト値が設定されます。

POLICY_ID                                   COVERAGE    SYS_START                                         SYS_END                                                TS_ID

--------- ----------- -------------------------------- -------------------------------- -------------------------------------------------------------------------------
ABC             12000 0001-01-01-00.00.00.000000000000 9999-12-30-00.00.00.000000000000 0001-01-01-00.00.00.000000000000
DEF             13000 0001-01-01-00.00.00.000000000000 9999-12-30-00.00.00.000000000000 0001-01-01-00.00.00.000000000000
ERT             14000 0001-01-01-00.00.00.000000000000 9999-12-30-00.00.00.000000000000 0001-01-01-00.00.00.000000000000

テンポラル表の更新を開始すると、関連する履歴表に変更前イメージが移入されます。

例2既存表をアプリケーション期間テンポラル表に変換

サンプルの既存表をアプリケーション期間テンポラル表に変換するには、次のように時間列およびBUSINESS_TIME期間を追加します。

ALTER TABLE policy_info ADD COLUMN bus_start DATE NOT NULL DEFAULT '10/10/2001'"
ALTER TABLE policy_info ADD COLUMN bus_end DATE NOT NULL DEFAULT '10/10/2002'
ALTER TABLE policy_info ADD PERIOD BUSINESS_TIME(bus_start, bus_end)

時間列を追加するときは、既存の時間列のビジネス有効期間の値を入力する際、bus_start列には必ずbus_endよりも小さい値が設定されていることを確認する必要があります(これらの列が各行のビジネス有効期間を示すため)。

新しいアプリケーション期間テンポラル表は次のように表示されます。

POLICY_ID   COVERAGE    BUS_START  BUS_END
--------- ----------- ---------- -------------------------------
ERT             14000              10/10/2001  10/10/2002
DEF             13000             10/10/2001   10/10/2002
ABC             12000             10/10/2001   10/10/2002

例3既存表をバイテンポラリ表に変換

次のように、SYSTEM_PERIOD、時間列およびSYSTEM_TIMEおよびBUSINESS_TIME期間を追加することで、サンプル既存の表をビットマップ表に変換できます。

ALTER TABLE policy_info
   ADD COLUMN sys_start TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW BEGIN;
ALTER TABLE policy_info
   ADD COLUMN sys_end TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW END;
ALTER TABLE policy_info
   ADD COLUMN ts_id TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS TRANSACTION START ID;
ALTER TABLE policy_info ADD PERIOD SYSTEM_TIME(sys_start, sys_end);

ALTER TABLE policy_info ADD COLUMN bus_start DATE NOT NULL DEFAULT '10/10/2001'"
ALTER TABLE policy_info ADD COLUMN bus_end DATE NOT NULL DEFAULT '10/10/2002'
ALTER TABLE policy_info ADD PERIOD BUSINESS_TIME(bus_start, bus_end)

時間列を追加するときは、既存の時間列のビジネス有効期間の値を入力する際、bus_start列には必ずbus_endよりも小さい値が設定されていることを確認する必要があります(これらの列が各行のビジネス有効期間を示すため)。

次に、次のいずれかの方法を使用して新しいテンポラル表の履歴表を作成します。

    CREATE TABLE hist_policy_info
(
 policy_id     CHAR(4) NOT NULL,

coverage     INT NOT NULL,
sys_start    TIMESTAMP(12) NOT NULL ,

sys_end      TIMESTAMP(12) NOT NULL,

ts_id            TIMESTAMP(12) NOT NULL

           );
 ALTER TABLE hist_policy_info ADD RESTRICT ON DROP;
CREATE TABLE hist_policy_info LIKE policy_info with RESTRICT ON DROP;
ALTER TABLE policy_info ADD VERSIONING USE HISTORY TABLE hist_policy_info.

表のGENERATED ALWAYS列は、常にデータベース・マネージャによって移入される列であり、ユーザーがこれらの列を制御することはできません。データベース・マネージャは、システム時間に基づいてこれらの列に移入します。

既存の行では、追加されたSYSTEM_PERIOD列とtransaction id列に、次のようなデフォルト値が設定されます。

POLICY_ID                                   COVERAGE    SYS_START                                         SYS_END                                                TS_ID

--------- ----------- -------------------------------- -------------------------------- -------------------------------------------------------------------------------
ABC             12000 0001-01-01-00.00.00.000000000000 9999-12-30-00.00.00.000000000000 0001-01-01-00.00.00.000000000000
DEF             13000 0001-01-01-00.00.00.000000000000 9999-12-30-00.00.00.000000000000 0001-01-01-00.00.00.000000000000
ERT             14000 0001-01-01-00.00.00.000000000000 9999-12-30-00.00.00.000000000000 0001-01-01-00.00.00.000000000000

テンポラル表の更新を開始すると、関連する履歴表に変更前イメージが移入されます。

追加されたSYSTEM_TIME期間、トランザクションIDおよび時間の各列に、次のようなデフォルト値が設定されます。

POLICY_ID COVERAGE    SYS_START                        SYS_END                          TS_ID                            BUS_START         BUS_END
--------- ----------- -------------------------------- -------------------------------- -------------------------------- ---------- -------------------------------------
ABC   12000 0001-01-01-00.00.00.000000000000 9999-12-30-00.00.00.000000000000 0001-01-01-00.00.00.000000000000 10/10/2001 10/10/2002
DEF             13000 0001-01-01-00.00.00.000000000000 9999-12-30-00.00.00.000000000000 0001-01-01-00.00.00.000000000000 10/10/2001 10/10/2002
ERT             14000 0001-01-01-00.00.00.000000000000 9999-12-30-00.00.00.000000000000 0001-01-01-00.00.00.000000000000 10/10/2001 10/10/2002

ユーザーがテンポラル表の更新を開始すると、履歴表に変更前イメージが移入されます。

例4異種環境でのレプリケーション。

適用側にテンポラルの表がない異種構成では、関連する履歴表はありませんが、システム期間表とバイテンポラルの表のみレプリケートできます。この状況でレプリケーションを実行する際は、SYSTEM_PERIOD列とトランザクションID列の値を処理する必要があります。これらの列にはターゲット・データベースでサポートされない値が含まれている可能性があります。最初にマップ変換関数を使用して、これらの値をターゲット・データベースでサポートされる形式に変換してから、列を適切にマップする必要があります。

たとえば、MySQLのDATETIME範囲は1000-01-01 00:00:00.000000から9999-12-31 23:59:59.999999までです。タイムスタンプ値0001-01-01-00.00.00.000000000000はMySQLにレプリケートできません。このような値をレプリケートするには、この値をMySQLのDATETIME値1000-01-01 00:00:00.000000に変換してから、列をマップする必要があります。次の行がpolicy_infoシステム期間表にある場合:

POLICY_ID                                   COVERAGE    SYS_START                                         SYS_END                                                TS_ID
--------- ----------- -------------------------------- -------------------------------- -------------------------------------------------------------------------------
ABC             12000 0001-01-01-00.00.00.000000000000 9999-12-30-00.00.00.000000000000 0001-01-01-00.00.00.000000000000

この行をMySQLにレプリケートするには、次のようにcolmap()関数を使用します。

map *source_schema*.policy_info, target *target_schema*.policy_info colmap
(policy_id=policy_id, coverage=coverage, sys_start= @IF( ( @NUMSTR( @STREXT(sys_
start,1,4))) > 1000, sys_start, '1000-01-01 00.00.00.000000'), sys_end=sys_end,
 ts_id= @IF( ( @NUMSTR( @STREXT(ts_id,1,4))) > 1000, ts_id, '1000-01-01
 00.00.00.000000'));

テンポラル表を使用した複製

次のいずれかの方法を選択して、システム期間またはビット一時表を次のようにレプリケートできます。

デフォルト・レプリケーションの使用中はSYSTEM_TIME期間列とtransactionstart id列が自動生成のままなので、Oracle GoldenGateで競合の検出や解決はできません。これらの列はset句とwhere句には指定できません。SUPPRESSTEMPORALUPDATESパラメータを使用する場合、Oracle GoldenGateではCDRがサポートされます。