自動競合検出および解決

Oracle GoldenGateによってOracleデータベース間で変更をレプリケートする場合、OracleデータベースでOracle GoldenGateの自動競合検出および解消を構成して管理できます。

ノート:

自動競合検出および解消機能は、Oracle Database 12cリリース2 (12.2)以降に固有の機能で、Oracleデータベースで構成されます。また、Oracle GoldenGate 12c (12.3.0.1)以降が必要です。Oracle GoldenGate競合検出および解消(CDR)と呼ばれる手動の競合検出および解消機能が存在します。Oracle GoldenGate CDRはReplicatパラメータ・ファイルで構成します。Oracle GoldenGate CDRの詳細は、次を参照してください

自動競合検出および解消について

Oracle GoldenGateによってOracleデータベース間で変更をレプリケートする場合、これらのデータベースで、Oracle GoldenGate競合検出および解決を自動的に構成して管理できます。

この機能は、アクティブ/アクティブ構成で使用することを目的としています。この場合、Oracle GoldenGateでは、同じデータセットを含む複数のデータベース間のデータ同期を維持する必要があります。

ノート:

Oracle DatabaseでOracle GoldenGateを使用する場合にのみ使用可能な自動競合検出および解決(ACDR)機能です。Oracle以外のデータベースの場合、Oracle GoldenGateでは手動の競合検出および解決(CDR)機能を使用できます。Oracle GoldenGate CDRはReplicatパラメータ・ファイルで構成します。

トピック:

自動競合検出および解決

Oracle Database間で表をレプリケートするOracle GoldenGate構成によって、自動競合検出および解決を構成できます。表に対して競合検出および解決を構成するには、DBMS_GOLDENGATE_ADMパッケージのADD_AUTO_CDRプロシージャをコールします。これは管理APIです。つまり、DBMS_GOLDENGATE_AUTH.GRANT_ADMIN_PRIVILEGEによって権限が付与されたOracle GoldenGate管理者がコールすることを想定しています。このユーザーには、影響する表を変更するための権限が必要になります。こうしたAPIによって、オブジェクトのバージョン番号がバンプされ、DDL実行のためにオブジェクトのロックも発生します。

管理者ユーザーは、こうしたAPIのコール時に適切なPDBにログインしている必要があります。ビット・フラグを表す次の3つの定数が追加されました。
  • EARLIEST_TIMESTAMP_RESOLUTION=0x0001では、TOMBSTONE KEY VERSIONINGを自動的に設定します。

  • DELETE_ALWAYS_WINS=0x0002では、TOMBSTONE KEY VERSIONINGを自動的に設定します。

  • IGNORE_SITE_PRIORITY=0x0004

Oracle GoldenGateが、Oracle Databaseが発生元である変更を取得するときに、各変更が行の論理変更レコード(LCR)にカプセル化されます。行LCRはDML行変更の構造化表現です。それぞれの行LCRに操作タイプ、古い列値および新しい列値が含まれます。複数の行LCRを単一のデータベース・トランザクションに含めることができます。

表の複数のレプリカで、表に対する変更が許可される場合に、異なる2つのデータベースの同じ行にほぼ同時に変更が加えられると、競合が発生することがあります。Oracle GoldenGateは行のLCRを使用して変更をレプリケートします。競合を検出するために、発生元データベースでの初期変更の行LCRに含まれる古い値を、宛先データベースの対応する表の行の現在の値(キー列で識別される)と比較します。一致しない列値がある場合は、競合が存在します。

競合を検出すると、Oracle GoldenGateは競合を解決するために、行の値を行LCRに含まれる値で上書きするか、行LCRの値を無視するか、デルタを計算して行の値を更新します。

次に示す理由で、自動競合検出および解決のためにアプリケーションを変更する必要はありません。

  • Oracle Databaseによって非表示のタイムスタンプ列が自動的に作成されて保持されます。

  • 挿入、更新および削除では、削除ツームストン・ログ表が使用されて行が削除されたか判断されます。

  • LOB列の競合を検出できます。

  • Oracle Databaseによって必要な列に対するサプリメンタル・ロギングが自動的に構成されます。

関連項目:

自動競合検出および解決の要件

サプリメンタル・ロギングは、競合を検出して解決するために必要な情報をそれぞれの行LCRに確実に含めるために必要です。サプリメンタル・ロギングは、表に対してDML操作が実行されたときに、表の行に関するREDOログに追加情報を配置します。Oracle GoldenGate競合検出および解決のために表を構成するときに、表のすべての列に対してサプリメンタル・ロギングが自動的に構成されます。REDOログの追加情報は、表の変更がレプリケートされるときにLCRに配置されます。

キャプチャには、Extractを使用する必要があります。統合Replicatまたは統合モードのパラレルReplicatを、適用側で使用する必要がありますLOGALLSUPCOLSはデフォルトのままにしてください

DELETE TOMBSTONE表には、オプションで追加されるタイムスタンプ型の非表示フィールドKEYVER$$があります。このフィールドは、EARLIEST TIMESTAMPDELETE ALWAYS WINSおよびSITE PRIORITYの解決のために必要になり、実表にも存在します。このフィールドが実表に存在することは、フラグまたはトークンとして証跡ファイルのメタデータで提示する必要があります。

DELETE TOMBSTONE表では、主キーの更新もサポートされています。DELETE TOMBSTONE表に、元のキー値の行(変更前イメージ)のためのエントリが挿入されます。DELETE TOMBSTONE表内の挿入を削除と一致させるExtractのロジックでは、PK更新またはPKがない場合はNULL値不可能のフィールドが1つ以上ある一意キー(UK)に一致させることも必要です。

サイト優先度には、Replicatからのサポートが必要です。両方のパラメータが実装され、その設定が適用に渡されます。

互換性と移行

KEYVER$$が存在しない実表から、EARLIEST TIMESTAMP解決のサポート、DELETE ALWAYS WINS解決またはSITE PRIORITYの設定されたターゲットにレプリケートすると、DELETEまたはPK更新に関連する場合にエラーが発生します。

KEYVER$$が存在する実表から、それが存在しないターゲットへのレプリケートでは、KEYVER$$は無視され、それより前のリリースにレプリケートするときには、フィールドは削除されるかサポートされません。

次の表に、keyver$$列が存在しないまたは以前のRDBMSバージョンのサイト1からサイト2へのレプリケーションでのEARLIEST TIMESTAMP解決を示します。
サイト1 サイト2 説明

挿入

挿入

サイト1CDRTS$タイムスタンプのほうが前になる場合はサイト1が優先され、それ以外の場合はサイト2が優先されます。

挿入

更新

挿入/挿入と同じです。

挿入

削除

競合は解決できません。構成によっては、エラーがエラー・キューに送られて、破棄されます。

挿入

pk更新

挿入/削除と同じです。

更新

挿入

挿入/挿入と同じです

更新

更新

挿入/挿入と同じです

更新

削除

挿入/削除と同じです。

更新

pk更新

挿入/削除と同じです。

削除

挿入

挿入/削除と同じです。

削除

更新

挿入/削除と同じです。

pk更新

挿入

挿入/削除と同じです。

pk更新

更新

挿入/削除と同じです。

pk更新

削除

挿入/削除と同じです。

主キーの更新(pk更新)の相互運用性は、バックポートなしでは正しく解決されません。前述の相互運用性の問題に加えて、以前のバージョンのRDBMSにレプリケートされたpk更新は正しく解決されません。以前のRDBMSでの挿入とレプリケートされたpk更新が競合すると、結果が2行になる可能性があります。元の行への挿入が成功して、pk更新が更新に成功するか新しい行を作成することになります。

プロシージャ属性とビュー列にのみ変更が加えられるため、アップグレード・スクリプトやダウングレード・スクリプトは不要です。

列グループ

列グループは、レプリケート表の1つ以上の列を論理的にグループ化したものです。列グループを追加すると、表内の他の列とは別個に、その列グループの列に対して競合検出および解消が実行されます。

ADD_AUTO_CDRプロシージャを使用して、Oracle GoldenGate競合検出および解決のために表を構成するときに、表のすべてのスカラー列がデフォルト列グループに追加されます。表のその他の列グループを定義するには、ADD_AUTO_CDR_COLUMN_GROUPプロシージャを実行します。ユーザー定義の列グループに属さない表の列は、表のデフォルト列グループに残ります。

列グループを使用すると、異なるデータベースで同じ行の異なる列をほぼ同時に更新しても、競合が発生しません。表の列グループが構成されている場合、異なるデータベースで表の同じ列を更新する場合でも競合を回避できます。更新により、異なる列グループの列値が変更された場合、競合は検出されません。

この例は、データベースAおよびデータベースBでレプリケートされている行を示しています。各データベースのレプリケートされた表には、次の2つの列グループが構成されています。

  • 1つの列グループにはOffice列が含まれます。この列グループの非表示のタイムスタンプ列はTS1です。

  • もう1つの列グループにはTitleおよびSalary列が含まれます。この列グループの非表示のタイムスタンプ列はTS2です。

これらの列グループを使用すると、データベースAおよびデータベースBで同じ行をほぼ同時に更新しても競合は発生しません。具体的には次のように変更されます。

  • データベースAで、Officeの値が1080から1030に変更されました。

  • データベースBで、Titleの値がMTS1からMTS2に変更されました。

Office列とTitle列は異なる列グループに属するため、変更をレプリケートしても競合は検出されません。その結果、それぞれの変更がレプリケートされた後は、行の値が両方のデータベースで同じになります。

ピース単位のLOB更新

LOB WRITELOB ERASEおよびLOB TRIMからなるLOB操作のセットは、ピース単位のLOB更新です。LOB列を含む表に対して競合検出および解決が構成されている場合、各LOB列は独自の列グループに配置され、列グループは独自の非表示のタイムスタンプを持ちます。タイムスタンプ列は、最初のピース単位のLOB操作時に更新されます。

LOB列の場合、次のように競合が検出されて解決されます。

  • LOBの列グループのタイムスタンプが、行の対応するLOB列グループより遅い場合、ピース単位のLOB更新が適用されます。

  • LOBの列グループのタイムスタンプが、行の対応するLOB列グループより早い場合、表の行のLOBが保持されます。

  • 表に行が存在しない場合はエラーが発生します

DELETE TOMBSTONE表

DELETE TOMBSTONE表は、削除されたレコード用のマーカーです。これにより、削除されたレコードと存在したことのないレコードを区別します。DELETE TOMBSTONE表には、少なくともキー列と操作タイムスタンプが格納されます。この情報は、削除の収束のために必要になります。受信する更新と挿入の一部は別のサイトから遅延する可能性があり、受信するLCRを適用するかどうかの決定はツームストン操作のタイムスタンプと比較してフィルタ処理する必要があるためです。

最初のタイムスタンプの競合検出および解決

名前の形式がCDRTS$ column groupおよびCDRTS$ROWの列は、列グループおよび行の変更時刻を反映するタイムスタンプの格納に使用します。DBMS_GOLDENGATE_ADMプロシージャのADD_AUTO_CDR()ADD_AUTO_CDR_COLUMN_GROUP()REMOVE_AUTO_CDR()REMOVE_AUTO_CDR_COLUMN_GROUP()ALTER_AUTO_CDR()およびALTER_AUTO_CDR_COLUMN_GROUP()は、現時点では、最新のタイムスタンプの解決でACDRを構成するために使用します。また、最初のタイムスタンプの解決でACDRを構成する場合にも使用します。ADD_AUTO_CDR()ALTER_AUTO_CDR()の両方にあるフィールドADDITIONAL_OPTIONSで最初のタイムスタンプの使用をオンにします。最初のタイムスタンプをオンにすると、自動的にバージョニングがオンになり、タイムスタンプ型の新しい非表示列KEYVER$$ (バージョン番号)が追加されます。最初のタイムスタンプの使用を示すために、新しいフラグ値がacdrflags_kqldtvcに追加されます。このフィールドは、DELETE TOMBSTONE表にも追加されます。削除の競合があるために、バージョン番号が必要になります。最初のタイムスタンプの解決では、透過的になる可能性のある削除の競合が誤って成功するだけでなく、行の新規挿入(新規バージョン)が妨げられることもあります。バージョン・タイムスタンプでは、同じ行バージョンの行DMLに対して削除を適切に解決できます。

行の元の挿入は、そのデフォルト値から現在のタイムスタンプを受信します。この行を削除すると、この行が挿入されたときのバージョン番号と時刻が削除時にツームストン表に挿入されます。新しい挿入の場合、デフォルトでは、バージョン番号が現在のタイムスタンプを再度受信するため、ツームストン表の現在の削除エントリとの誤った競合が回避されます。

キー・バージョンがkv、タイムスタンプがtsの場合

データベース1: insert tab1 key1 kv1 ts1

データベース2: delete tab1 key1 kv1 ts1

DELETE TOMBSTONE表への挿入key1 kv1 ts1

データベース1: insert tab1 key1 kv2 ts2

キー・バージョンを使用しない場合は、挿入が無視され、削除タイムスタンプはそれよりも前になります。キー・バージョンが使用されているため、kv2は削除された行のバージョンでないことがわかり、挿入が成功します。

最新のタイムスタンプの競合検出および解消

DBMS_GOLDENGATE_ADMパッケージのADD_AUTO_CDRプロシージャを実行して、Oracle GoldenGate自動競合検出および解決のために表を構成すると、非表示のタイムスタンプ列が表に追加されます。この非表示のタイムスタンプ列によって行変更の時間が記録され、この情報を使用して競合が検出されて解決されます。

行LCRを適用すると、INSERTUPDATEまたはDELETE操作で競合が発生する可能性があります。次の表では、それぞれの競合のタイプと、その解決方法について説明します。

操作 競合検出 競合解決

INSERT

競合が検出されるのは、表のキー列の値が行LCRの新しい値と同じ場合です。

行LCRのタイムスタンプが表の行のタイムスタンプより遅い場合は、行LCRの値で表の値が置き換えられます。

行LCRのタイムスタンプが表の行のタイムスタンプより早い場合は、行LCRが破棄され、表の値が保持されます。

UPDATE

次のそれぞれの場合に競合が検出されます。

  • 行LCRのタイムスタンプ値と、表の対応する行のタイムスタンプ値が一致しない場合。

  • 行LCRの列グループの古い値が、対応する表の行の列値と一致しない場合。列グループは、レプリケート表の1つ以上の列を論理的にグループ化したものです。

  • 表の行が存在しない場合。行がツームストン表にある場合は、更新/削除競合と呼ばれます。

値が一致せず、行LCRのタイムスタンプが表の行のタイムスタンプより遅い場合は、行LCRの値で表の値が置き換えられます。

値が一致せず、行LCRのタイムスタンプが表の行のタイムスタンプより早い場合は、行LCRが破棄され、表の値が保持されます。

表の行が存在せず、行LCRのタイムスタンプがツームストン表の行のタイムスタンプより遅い場合は、行LCRがUPDATE操作からINSERT操作に変換され、表に挿入されます。

表の行が存在せず、行LCRのタイムスタンプがツームストン表の行のタイムスタンプより早い場合は、行LCRが破棄されます。

表の行が存在せず、対応する行がツームストン表に存在しない場合は、行LCRがUPDATE操作からINSERT操作に変換され、表に挿入されます。

DELETE

次のそれぞれの場合に競合が検出されます。

  • 行LCRのタイムスタンプ値と、表の対応する行のタイムスタンプ値が一致しない場合。

  • 表の行が存在しない場合。

行LCRのタイムスタンプが表のタイムスタンプより遅い場合は、行が表から削除されます。

行LCRのタイムスタンプが表のタイムスタンプより早い場合は、行LCRが破棄され、表の値が保持されます。

削除が成功した場合は、行LCRがツームストン表に挿入されてログに記録されます。

表の行が存在しない場合は、行LCRがツームストン表に挿入されてログに記録されます。

削除を常時優先するタイムスタンプのCDR

DELETE ALWAYS WINSは、DBMS_GOLDENGATE_ADMプロシージャのADD_AUTO_CDR()ALTER_AUTO_CDR()の両方のフィールドADDITIONAL_OPTIONSによって有効化します。これも削除の競合解決の方法ですが、最新のタイムスタンプの解決を使用していないことからバージョニングが必要になります。DELETE ALWAYS WINSをオンにすると、自動的にバージョニングがオンになり、タイムスタンプ型の新しい非表示列KEYVER$$ (バージョン番号)が追加されます。DELETE ALWAYS WINSの使用を示すために、新しいフラグ値がacdrflags_kqldtvcに追加されます。このフィールドは、DELETE TOMBSTONE表にも追加されます。EARLIEST TIMESTAMPの解決と同様にバージョニングの問題が存在します。

例:

キー・バージョンがkv、タイムスタンプがts

データベース1: insert tab1 key1 kv1 ts1

データベース2: delete tab1 key1 kv1 ts1

DELETE TOMBSTONE表への挿入key1 kv1 ts1

データベース1: insert tab1 key1 kv2 ts2

キー・バージョンを使用しない場合は、挿入が無視され、削除が常時優先されます。キー・バージョンが使用されているため、kv2は削除された行のバージョンでないことがわかり、挿入が成功します。

デルタ競合検出および解消

デルタ競合検出では、行LCRの古い列リストの値が表の対応する行の値と異なる場合に、競合が発生します。

表に対してデルタ競合検出および解決を構成するには、DBMS_GOLDENGATE_ADMパッケージのADD_AUTO_CDR_DELTA_RESプロシージャを実行します。デルタ解決方法は、タイムスタンプまたは追加の解決の列には依存しません。デルタ競合解決では、競合を解決するために、行LCRの新しい値と古い値の差が表の値に加算されます。この解決方法は一般に、勘定科目残高などの財務データに使用されます。たとえば、銀行残高が2つのサイトで同時に更新される場合、すべての借方および貸方で収束値が計上されます。

この例は、データベースAおよびデータベースBでレプリケートされている行を示しています。Balance列は、デルタ競合解決の実行対象として指定された列、TS1列は非表示のタイムスタンプ列で、Balance列に対する各変更の時刻を追跡します。両方のデータベースで、行の Balance値にほぼ同時に変更が加えられます(データベースAでは@T20、データベースBでは@T22)。これらの変更により競合が発生するため、デルタ競合解決を使用して次のように競合を解決します。

  • データベースAで、Balance値が100から110に変更されました。したがって、値が10だけ増加しました。

  • データベースBで、Balance値が100から120に変更されました。したがって、値が20だけ増加しました。

  • データベースAで競合を解決するために、行LCRの新しい値と古い値の差が表の値に加算されます。LCRの新しい値と古い値の差は20です(120–100=20)。したがって、表の現在の値(110)が20だけ増加して、競合解決後の値は130になります。

  • データベースBで競合を解決するために、行LCRの新しい値と古い値の差が表の値に加算されます。LCRの新しい値と古い値の差は10です(110–100=10)。したがって、表の現在の値(120)が10だけ増加して、競合解決後の値は130になります。

デルタ競合解決後は、データベースAとデータベースBの行で、Balance列の値が同一になります。

サイト優先度のCDR

ノート:

SITE PRIORITYの解決は、すべてのCOLUMN GROUPの解決設定よりも優先されます。

ノート:

ReplicatパラメータのSITE PRIORITYが、パラメータ・ファイル内の適切なマップ文の前に配置されていない場合は機能しません。このパラメータは、適切なマップ文の前に配置する必要があります。

競合解決のソースとターゲットの間でのReplicatパラメータ・ファイルで指定した優先度による解決。

SITE PRIORITYは、Replicatパラメータ・ファイルでデータベースまたはPDBに対してオンにします。このファイルで、表に対するSITE PRIORITYの解決をオンにするために、パラメータACDR SITE_PRIORITY {source_db_name}{OVERWRITE | IGNORE }を指定します。OVERWRITEを指定すると、ソース表が優先され、競合はOVERWRITEによって解決されます。それとは逆に、IGNOREを指定すると、ターゲット表が優先され、競合時にはソース表の変更が無視されます。SITE PRIORITYの解決をオフにするには、DBMS_GOLDENGATE_ADMプロシージャのADD_AUTO_CDR()ALTER_AUTO_CDR()の両方のフィールドADDITIONAL_OPTIONSでビットIGNORE_SITE_PRIORITYを設定します。Replicatのソースとターゲットの関係は様々な設定が可能なため、収束はユーザーの設定に依存します。

削除ツームストーンのPK更新の追跡

主キー(PK)の更新を完全にサポートするには、キーの変更前イメージで表される行とキーの変更後イメージで表される行の両方で競合を処理する必要があります。PK更新は自律型の削除および挿入のため、PK更新の競合は、キーの変更前イメージの競合とキー(および行)の変更後イメージの挿入の削除としてサポートされている必要があります。

キーの変更前イメージで表される行の削除としてPK更新をサポートすることは、削除ツームストン表に削除として挿入する必要があることを意味します。PKの更新時にツームストン表に挿入するために、更新内部トリガーが追加されます(実際には、行を識別するキーが追加されます。これは、存在する場合はPK、それ以外の場合はNULL値不可能の列が1つ以上ある指定のUKになります)。PKの更新によって2つの競合が発生する可能性があるため、行レベルで最大2つの解決が試行され、元のPKを持つ行が削除され、新しいPKを持つ行が挿入されます。

例: 最新のタイムスタンプの解決の使用

データベース1: tab1 key1 at ts1に対する更新

データベース2: tab1 key1 set key1 to key2 ts2に対する更新

データベース3: tab1 key2 ts3に対する更新

このシナリオでは、行レベルでkey1を含むtab1の行が削除され、データベース3の更新がtab1の行key2の最終変更になると考えられます。かわりに、データベース2がts3で、データベース3がts3の場合は、データベース2でのPK更新がtab1の行key2の最終変更になります。

ここで、データベース1がts3、データベース2がts2、データベース3がts1の場合について考えてみると、データベース1のtab1の行key1への更新は成功し、データベース2のtab1の行key2からのPK更新は成功します。この時点で、完全な解決策では、変更前イメージの削除と変更後イメージの挿入の両方を別々に解決する必要があると考えられます。これは、その両者が相互に依存することなく、一方の値の損失が両方の損失にならないことを意味します。

デルタ競合検出および解消の構成

DBMS_GOLDENGATE_ADMパッケージのADD_AUTO_CDR_DELTA_RESプロシージャを使用して、デルタ競合検出および解決を構成します。

デルタ競合解決では、競合が検出された列を1つ指定して解決します。行LCRの列の値が表の対応する値と一致しない場合に、競合が検出されます。競合を解決するために、行LCRの新しい値と古い値の差が表の値に加算されます。

DBMS_GOLDENGATE_ADMパッケージのGRANT_ADMIN_PRIVILEGEプロシージャを使用して、Oracle GoldenGate管理者を構成できます。
  1. Oracle GoldenGate管理者としてインバウンド・サーバー・データベースに接続します。
  2. ADD_AUTO_CDRプロシージャを実行して表を指定し、最新のタイムスタンプの競合検出および解決を構成します。
  3. ADD_AUTO_CDR_DELTA_RESプロシージャを実行して、デルタ競合検出および解決の実行対象の列を指定します。
  4. 表をレプリケートする各Oracle Databaseに対して前述のステップを繰り返します。

例11-20 表に対するデルタ競合検出および解決の構成

この例では、oe.orders表のorder_total列に対して、デルタ競合検出および解決を構成します。

BEGIN
  DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR(
    SCHEMA_NAME => 'OE',
    TABLE_NAME  => 'ORDERS');
END;
/

BEGIN
  DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR_DELTA_RES(
    SCHEMA_NAME => 'OE',
    TABLE_NAME  => 'ORDERS',
    COLUMN_NAME => 'ORDER_TOTAL');
END;
/

最新のタイムスタンプの競合検出および解消の構成

DBMS_GOLDENGATE_ADMパッケージのADD_AUTO_CDRプロシージャを使用して、最新タイムスタンプの競合検出および解決を構成します。ADD_AUTO_CDR_COLUMN_GROUPプロシージャでオプションの列グループを追加します。

最新タイムスタンプの競合検出および解決では、行LCRのタイムスタンプ列が、対応する表の行のタイムスタンプと一致しない場合に、競合が検出されます。タイムスタンプがより遅い場合に行LCRが適用されます。その他の場合は行LCRが破棄され、表の行は変更されません。ADD_AUTO_CDRプロシージャを実行すると、指定した表の各行に非表示のタイムスタンプ列が追加され、タイムスタンプの競合検出および解決が構成されます。ADD_AUTO_CDR_COLUMN_GROUPプロシージャを使用して1つ以上の列グループを追加すると、列グループにタイムスタンプが追加され、列グループに対してタイムスタンプの競合検出および解決が構成されます。

DBMS_GOLDENGATE_ADMパッケージのGRANT_ADMIN_PRIVILEGEプロシージャを使用して、Oracle GoldenGate管理者を構成できます。
  1. Oracle GoldenGate管理者としてインバウンド・サーバー・データベースに接続します。
  2. ADD_AUTO_CDRプロシージャを実行して表を指定し、最新のタイムスタンプの競合検出および解決を構成します。
  3. オプション: ALTER_AUTO_CDR_COLUMN_GROUPプロシージャを実行して、表に1つ以上の列グループを指定します。
  4. 表をレプリケートする各Oracle Databaseに対して前述のステップを繰り返します。

例11-21 表に対する最新タイムスタンプの競合検出および解決の構成

この例では、hr.employees表に対して、最新タイムスタンプの競合検出および解決を構成します。

BEGIN
  DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR(
    schema_name => 'hr',
    table_name  => 'employees');
END;
/

例11-22 列グループの構成

この例では、hr.employees表に対するタイムスタンプの競合解決のために、次の列グループを構成します。

  • job_identifier_cg列グループには、job_iddepartment_idおよびmanager_id列が含まれます。

  • compensation_cg列グループには、salaryおよびcommission_pct列が含まれます。

BEGIN
  DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR_COLUMN_GROUP(
    schema_name       => 'hr',
    table_name        => 'employees',
    column_list       => 'job_id,department_id,manager_id',
    column_group_name => 'job_identifier_cg');
END;
/

BEGIN
  DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR_COLUMN_GROUP(
    schema_name       => 'hr',
    table_name        => 'employees',
    column_list       => 'salary,commission_pct',
    column_group_name => 'compensation_cg');
END;
/

デルタ競合検出および解消の構成

DBMS_GOLDENGATE_ADMパッケージのADD_AUTO_CDR_DELTA_RESプロシージャを使用して、デルタ競合検出および解決を構成します。

デルタ競合解決では、競合が検出された列を1つ指定して解決します。行LCRの列の値が表の対応する値と一致しない場合に、競合が検出されます。競合を解決するために、行LCRの新しい値と古い値の差が表の値に加算されます。

DBMS_GOLDENGATE_ADMパッケージのGRANT_ADMIN_PRIVILEGEプロシージャを使用して、Oracle GoldenGate管理者を構成できます。
  1. Oracle GoldenGate管理者としてインバウンド・サーバー・データベースに接続します。
  2. ADD_AUTO_CDRプロシージャを実行して表を指定し、最新のタイムスタンプの競合検出および解決を構成します。
  3. ADD_AUTO_CDR_DELTA_RESプロシージャを実行して、デルタ競合検出および解決の実行対象の列を指定します。
  4. 表をレプリケートする各Oracle Databaseに対して前述のステップを繰り返します。

例11-23 表に対するデルタ競合検出および解決の構成

この例では、oe.orders表のorder_total列に対して、デルタ競合検出および解決を構成します。

BEGIN
  DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR(
    SCHEMA_NAME => 'OE',
    TABLE_NAME  => 'ORDERS');
END;
/

BEGIN
  DBMS_GOLDENGATE_ADM.ADD_AUTO_CDR_DELTA_RES(
    SCHEMA_NAME => 'OE',
    TABLE_NAME  => 'ORDERS',
    COLUMN_NAME => 'ORDER_TOTAL');
END;
/

自動競合検出および解消の管理

DBMS_GOLDENGATE_ADMパッケージを使用して、Oracle DatabaseでOracle GoldenGate自動競合検出および解決を管理できます。

表に対する競合検出および解消の変更

DBMS_GOLDENGATE_ADMパッケージのALTER_AUTO_CDRプロシージャを使用して、表に対する競合検出および解決を変更します。
Oracle GoldenGate自動競合検出および解決を表に対して構成する必要があります。
  1. Oracle GoldenGate管理者としてインバウンド・サーバー・データベースに接続します。
  2. ALTER_AUTO_CDRプロシージャを実行して表を指定し、最新のタイムスタンプの競合検出および解決を構成します。
  3. 表をレプリケートする各Oracle Databaseに対して前述のすべてのステップを繰り返します。

例11-24 表に対する競合検出および解決の変更

この例では、HR.EMPLOYEES表の競合検出および解決を変更して、ツームストン表で削除の競合を追跡するよう指定しています。

BEGIN
  DBMS_GOLDENGATE_ADM.ALTER_AUTO_CDR(
    SCHEMA_NAME       => 'HR',
    TABLE_NAME        => 'EMPLOYEES',
    TOMBSTONE_DELETES => TRUE);
END;
/

列グループの変更

ALTER_AUTO_CDR_COLUMN_GROUPプロシージャにより列グループを変更します。
  1. Oracle GoldenGate管理者としてインバウンド・サーバー・データベースに接続します。
  2. ALTER_AUTO_CDR_COLUMN_GROUPプロシージャを実行して、表に1つ以上の列グループを指定します。
  3. 表をレプリケートする各Oracle Databaseに対して前述のすべてのステップを繰り返します。

例11-25 列グループの変更

この例では、HR.EMPLOYEES表のJOB_IDENTIFIER_CG列グループからMANAGER_ID列を削除します。

BEGIN
  DBMS_GOLDENGATE_ADM.ALTER_AUTO_CDR_COLUMN_GROUP(
    SCHEMA_NAME        => 'HR',
    TABLE_NAME         => 'EMPLOYEES',
    COLUMN_GROUP_NAME  => 'JOB_IDENTIFIER_CG',
    REMOVE_COLUMN_LIST => 'MANAGER_ID');
END;
/

ノート:

複数の列がある場合はコンマ区切りリスト使用してください。

ツームストン行のパージ

PURGE_TOMBSTONESプロシージャにより、指定の日時より前に記録されたツームストン行を削除します。このプロシージャは、データベースの競合解決が構成されているすべての表のツームストン行を削除します。
時間経過に伴ってツームストン・ログが大きくなりすぎることを防ぐため、場合によってはツームストン行を定期的にパージする必要があります。
  1. Oracle GoldenGate管理者としてインバウンド・サーバー・データベースに接続します。
  2. PURGE_TOMBSTONESプロシージャを実行して日時を指定します。

例11-26 ツームストン行のパージ

この例では、2015年12月1日の午後3:00時(東部標準時間)より前に記録されたすべてのツームストン行をパージします。TIMESTAMP WITH TIME ZONE形式でタイムスタンプを入力する必要があります。

EXEC DBMS_GOLDENGATE_ADM.PURGE_TOMBSTONES('2015-12-01 15:00:00.000000 EST');

表からの競合検出および解消の削除

DBMS_GOLDENGATE_ADMパッケージのREMOVE_AUTO_CDRプロシージャを使用して、自動競合検出および解決を表から削除します。このプロシージャは、表に対して構成された列グループ、およびデルタ競合検出および解決も削除します。
  1. Oracle GoldenGate管理者としてインバウンド・サーバー・データベースに接続します。
  2. REMOVE_AUTO_CDRプロシージャを実行して表を指定します。
  3. 表をレプリケートする各Oracle Databaseに対して前述のすべてのステップを繰り返します。

例11-27 表の競合検出および解決の削除

この例では、hr.employees表の競合検出および解決を削除します。

BEGIN
  DBMS_GOLDENGATE_ADM.REMOVE_AUTO_CDR(
    schema_name => 'hr',
    table_name  => 'employees');
END;
/

列グループの削除

REMOVE_AUTO_CDR_COLUMN_GROUPプロシージャにより列グループを削除します。
  1. Oracle GoldenGate管理者としてインバウンド・サーバー・データベースに接続します。
  2. REMOVE_AUTO_CDR_COLUMN_GROUPプロシージャを列グループの名前を指定して実行します。
  3. 表をレプリケートする各Oracle Databaseに対して前述のすべてのステップを繰り返します。

例11-28 列グループの削除

この例では、hr.employees表からcompensation_cg列グループを削除します。

BEGIN
  DBMS_GOLDENGATE_ADM.REMOVE_AUTO_CDR_COLUMN_GROUP(
    schema_name       => 'hr',
    table_name        => 'employees',
    column_group_name => 'compensation_cg');
END;
/

デルタ競合検出および解消の削除

DBMS_GOLDENGATE_ADMパッケージのREMOVE_AUTO_CDR_DELTA_RESプロシージャを使用して、列に対するデルタ競合検出および解決を削除します。
指定した列に対してデルタ競合検出および解決が構成されている必要があります。
  1. Oracle GoldenGate管理者としてインバウンド・サーバー・データベースに接続します。
  2. REMOVE_AUTO_CDR_DELTA_RESプロシージャを実行して列を指定します。
  3. 表をレプリケートする各Oracle Databaseに対して前述のすべてのステップを繰り返します。

例11-29 表のデルタ競合検出および解決の削除

この例では、OE.ORDERS表のORDER_TOTAL列のデルタ競合検出および解決を削除します。

BEGIN
  DBMS_GOLDENGATE_ADM.REMOVE_AUTO_CDR_DELTA_RES(
    SCHEMA_NAME => 'OE',
    TABLE_NAME  => 'ORDERS',
    COLUMN_NAME => 'ORDER_TOTAL');
END;
/

自動競合検出および解消の監視

データ・ディクショナリ・ビューを問い合せて、Oracle DatabaseでOracle GoldenGate自動競合検出および解決をモニターできます。

競合のために構成された表に関する情報の表示

ALL_GG_AUTO_CDR_TABLESビューには、Oracle GoldenGate自動競合検出および解決のために構成された表に関する情報が表示されます。
  1. データベースに接続
  2. ALL_GG_AUTO_CDR_TABLESビューを問い合せます。

例11-30 競合検出および解決のために構成された表に関する情報の表示

この問合せによって、競合検出および解決のために構成された表について次のような情報が表示されます。

  • 各表の所有者

  • 各表の名前

  • 更新/削除競合により削除された行を格納するツームストン表(表に対してツームストン表が構成されている場合)

  • 各表の競合解決に使用される非表示のタイムスタンプ列

COLUMN TABLE_OWNER FORMAT A15
COLUMN TABLE_NAME FORMAT A15
COLUMN TOMBSTONE_TABLE FORMAT A15
COLUMN ROW_RESOLUTION_COLUMN FORMAT A25

SELECT TABLE_OWNER,
       TABLE_NAME, 
       TOMBSTONE_TABLE,
       ROW_RESOLUTION_COLUMN 
  FROM ALL_GG_AUTO_CDR_TABLES
  ORDER BY TABLE_OWNER, TABLE_NAME;

出力結果は次のようになります。

TABLE_OWNER     TABLE_NAME      TOMBSTONE_TABLE ROW_RESOLUTION_COLUMN
--------------- --------------- --------------- -------------------------
HR              EMPLOYEES       DT$_EMPLOYEES   CDRTS$ROW
OE              ORDERS          DT$_ORDERS      CDRTS$ROW

競合解消列に関する情報の表示

ALL_GG_AUTO_CDR_COLUMNSビューには、Oracle GoldenGate自動競合検出および解決のために構成された列に関する情報が表示されます。
列は、行または列の自動競合検出および解決のために構成できます。列は、列グループの最新のタイムスタンプの競合解決のために構成できます。さらに、列はデルタ競合解決のために構成できます。
  1. Oracle GoldenGate管理者としてデータベースに接続します。
  2. ALL_GG_AUTO_CDR_COLUMNSビューを問い合せます。

例11-31 列グループに関する情報の表示

この問合せによって、競合検出および解決のために構成された表について次のような情報が表示されます。

  • 各表の所有者

  • 各表の名前

  • 列グループの名前(列が列グループに属する場合)

  • 列名。

  • 列に関する非表示のタイムスタンプ列(列に対して最新のタイムスタンプの競合解決が構成されている場合)

COLUMN TABLE_OWNER FORMAT A10
COLUMN TABLE_NAME FORMAT A10
COLUMN COLUMN_GROUP_NAME FORMAT A17
COLUMN COLUMN_NAME FORMAT A15
COLUMN RESOLUTION_COLUMN FORMAT A23

SELECT TABLE_OWNER,
       TABLE_NAME, 
       COLUMN_GROUP_NAME,
       COLUMN_NAME,
       RESOLUTION_COLUMN 
  FROM ALL_GG_AUTO_CDR_COLUMNS
  ORDER BY TABLE_OWNER, TABLE_NAME;

出力結果は次のようになります。

TABLE_OWNE TABLE_NAME COLUMN_GROUP_NAME COLUMN_NAME     RESOLUTION_COLUMN
---------- ---------- ----------------- --------------- -----------------------
HR         EMPLOYEES  COMPENSATION_CG   COMMISSION_PCT  CDRTS$COMPENSATION_CG
HR         EMPLOYEES  COMPENSATION_CG   SALARY          CDRTS$COMPENSATION_CG
HR         EMPLOYEES  JOB_IDENTIFIER_CG MANAGER_ID      CDRTS$JOB_IDENTIFIER_CG
HR         EMPLOYEES  JOB_IDENTIFIER_CG JOB_ID          CDRTS$JOB_IDENTIFIER_CG
HR         EMPLOYEES  JOB_IDENTIFIER_CG DEPARTMENT_ID   CDRTS$JOB_IDENTIFIER_CG
HR         EMPLOYEES  IMPLICIT_COLUMNS$ PHONE_NUMBER    CDRTS$ROW
HR         EMPLOYEES  IMPLICIT_COLUMNS$ LAST_NAME       CDRTS$ROW
HR         EMPLOYEES  IMPLICIT_COLUMNS$ HIRE_DATE       CDRTS$ROW
HR         EMPLOYEES  IMPLICIT_COLUMNS$ FIRST_NAME      CDRTS$ROW
HR         EMPLOYEES  IMPLICIT_COLUMNS$ EMAIL           CDRTS$ROW
HR         EMPLOYEES  IMPLICIT_COLUMNS$ EMPLOYEE_ID     CDRTS$ROW
OE         ORDERS     IMPLICIT_COLUMNS$ ORDER_MODE      CDRTS$ROW
OE         ORDERS     IMPLICIT_COLUMNS$ ORDER_ID        CDRTS$ROW
OE         ORDERS     IMPLICIT_COLUMNS$ ORDER_DATE      CDRTS$ROW
OE         ORDERS     IMPLICIT_COLUMNS$ CUSTOMER_ID     CDRTS$ROW
OE         ORDERS     DELTA$            ORDER_TOTAL
OE         ORDERS     IMPLICIT_COLUMNS$ PROMOTION_ID    CDRTS$ROW
OE         ORDERS     IMPLICIT_COLUMNS$ ORDER_STATUS    CDRTS$ROW
OE         ORDERS     IMPLICIT_COLUMNS$ SALES_REP_ID    CDRTS$ROW

この例では、列グループ名としてIMPLICIT_COLUMNS$を持つ列に対して行の競合検出および解決が構成されていますが、これらの列は列グループには属していません。列グループ名としてDELTA$を持つ列には、デルタ競合検出および解決が構成されていますが、これらの列は解決列を持ちません。

列グループに関する情報の表示

ALL_GG_AUTO_CDR_COLUMN_GROUPSビューには、Oracle GoldenGate自動競合検出および解決のために構成された列グループに関する情報が表示されます。
DBMS_GOLDENGATE_ADMパッケージのADD_AUTO_CDRプロシージャを使用して、Oracle GoldenGate自動競合検出および解決を構成できます。DBMS_GOLDENGATE_ADMパッケージのADD_AUTO_CDR_COLUMN_GROUPプロシージャを使用して、列グループを構成できます。
  1. Oracle GoldenGate管理者としてデータベースに接続します。
  2. ALL_GG_AUTO_CDR_COLUMN_GROUPSビューを問い合せます。

例11-32 列グループに関する情報の表示

この問合せによって、競合検出および解決のために構成された表について次のような情報が表示されます。

  • 表の所有者。

  • 表名。

  • 列グループの名前

  • 各列グループの競合解決に使用される非表示のタイムスタンプ列

COLUMN TABLE_OWNER FORMAT A15
COLUMN TABLE_NAME FORMAT A15
COLUMN COLUMN_GROUP_NAME FORMAT A20
COLUMN RESOLUTION_COLUMN FORMAT A25

SELECT TABLE_OWNER,
       TABLE_NAME, 
       COLUMN_GROUP_NAME,
       RESOLUTION_COLUMN 
  FROM ALL_GG_AUTO_CDR_COLUMN_GROUPS
  ORDER BY TABLE_OWNER, TABLE_NAME;

出力は、次のようになります。

TABLE_OWNER     TABLE_NAME      COLUMN_GROUP_NAME    RESOLUTION_COLUMN
--------------- --------------- -------------------- -------------------------
HR              EMPLOYEES       COMPENSATION_CG      CDRTS$COMPENSATION_CG
HR              EMPLOYEES       JOB_IDENTIFIER_CG    CDRTS$JOB_IDENTIFIER_CG