自動競合検出および解決

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

ノート:

自動競合検出および解決機能は、Oracle Database 12cリリース2 (12.2)以降から使用でき、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データベース間で表をレプリケートするOracle GoldenGate構成で自動競合検出および解消を構成できます。表に対して自動競合検出および解決を構成するには、DBMS_GOLDENGATE_ADMパッケージのADD_AUTO_CDRプロシージャをコールする必要があります。自動競合検出および解決を設定するための前提条件として、Oracle GoldenGateユーザーには適切な権限が必要です。ユーザー権限について学習するには、「Oracle Database 23ai以降でのユーザー権限の付与」および「Oracle Database 21c以前のユーザー権限の付与」を参照してください。

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

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

  • IGNORE_SITE_PRIORITY

次の例では、HR.EMPLOYEES表に対してALTERコマンドを使用します。

BEGIN
 dbms_goldengate_adm.alter_auto_cdr
 (schema_name => 'HR' 
 ,table_name => 'EMPLOYEES' 
 ,additional_options => DBMS_GOLDENGATE_ADM.ADDITIONAL_OPTIONS_ADD_KEY_VERSION );
END;
/

『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』ADD_AUTO_CDRプロシージャadditional_optionsの説明を参照してください。

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$$列がソース・データベースの実表に含まれていないが、ターゲット実表には含まれている場合、DELETEおよび主キー更新によって、EARLIEST TIMESTAMPDELETE ALWAYS WINSおよびSITE PRIORITY解決のターゲット・データベースでエラーが発生します。

KEYVER$$を含む実表からターゲット表にレプリケートしようとしてレプリケートされなかった場合、KEYVER$$列は無視されます。

列グループ

列グループは、レプリケート表の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が保持されます。

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

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

名前の形式が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()

ADD_AUTO_CDR()ALTER_AUTO_CDR()の両方にあるフィールドADDITIONAL_OPTIONSで最初のタイムスタンプの使用をオンにします。最初のタイムスタンプをオンにすると、自動的にバージョニングがオンになり、タイムスタンプ型の新しい非表示列KEYVER$$ (バージョン番号)が追加されます。最初のタイムスタンプの使用を示すために、新しいフラグ値が追加されます。このフィールドは、DELETE TOMBSTONE表にも追加されます。削除の競合があるために、バージョン番号が必要になります。最初のタイムスタンプの解決では、透過的になる可能性のある削除の競合が誤って成功するだけでなく、行の新規挿入(新規バージョン)が妨げられることもあります。バージョン・タイムスタンプでは、同じ行バージョンの行DMLに対して削除を適切に解決できます。

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

サイト1とサイト2のデータベース間でグローバルに一貫性のある表tab1があるとします。この表には(主)キーが含まれます。ACDRは、キー・バージョン(kv)およびタイムスタンプ(ts)を実表(非表示)およびツームストン表の列として自動的に維持します。キー・バージョンが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がツームストン表に挿入されてログに記録されます。

次のイメージは、データベースAとデータベースBの間の競合解決を示しています。
最新のタイムスタンプ・メソッドを使用した最新のタイムスタンプによる競合解決。

この例は、データベースAおよびデータベースBでレプリケートされている行を示しています。データベース列は、NameRowTSOfficeTitleおよびSalaryです。RowTS列は、両方のデータベースで非表示の列です。データベースAのOffice列に更新があり、同時にデータベースBのTitle列に更新があります。これにより競合が発生し、この競合の解決は最新のタイムスタンプ・メソッドを適用して行われます。

  • データベースAでは、Office列の値が1080から1103に更新され、RowTS値が@TS10から@TS20に変更されます。矢印は、この変更がデータベースBにレプリケートされることを示します。

  • データベースBでは、Title列の値がMTS1からMTS2に変更され、RowTS値が@TS10から@TS22に変更されます。

  • この競合を解決するために、データベースBに存在する最新のタイムスタンプが優先されます。これは、データベースAの変更が適用されないことを意味します。データベースAおよびデータベースBに適用される最終的な値は、Scott、@TS22、1080、MTS2、100です。

デルタ競合解決

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

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

次の図は、デルタ競合検出および解消の例を示します。

図11-2 デルタ競合検出および解決

図11-2の説明が続きます
「図11-2 デルタ競合検出および解決」の説明

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

  • データベースAで、Balance値が1000から1750に変更されました。したがって、値が750増加しました。

  • データベースBで、Balance値が1000から950に変更されました。したがって、値が50減少しました。

  • データベースAで競合を解決するために、行LCRの新しい値と古い値の差が表の値に加算されます。LCRの新しい値と古い値の差は(1000+750-50=1700)です。表の現在の値が700増加して、競合解決後の値は1700になります。

  • データベースBで競合を解決するために、行LCRの新しい値と古い値の差が表の値に加算されます。LCRの新しい値と古い値の差は750です(1000 - 50 + 750)=1700。したがって、表の現在の値(950)が750増加して、競合解決後の値は1700になります。

デルタ競合解決後は、データベース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_OPTIONSIGNORE_SITE_PRIORITYを設定します。

Replicatのソースとターゲットの関係は様々な設定が可能なため、収束はユーザーの設定に依存します。

削除を常時優先するタイムスタンプの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は削除された行のバージョンでないことがわかり、挿入が成功します。

DELETE TOMBSTONE表

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

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

主キー(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-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パッケージのADD_AUTO_CDRプロシージャを使用して、最新タイムスタンプの競合検出および解決を構成します。ADD_AUTO_CDR_COLUMN_GROUPプロシージャでオプションの列グループを追加します。

Oracle Database 23ai以降では、ACDR構成表を管理およびメンテナンスするための追加のメソッドが存在します。基礎となるAUTO-CDR関連の列をUNUSED列として保持したり、REMOVE_AUTO_CDRプロシージャをコールした直後に削除することもできます。

ADD_AUTO_CDRプロシージャを表に適用する場合、AUTO_CDRが削除されると、その内部列はデフォルトで未使用とマークされます。REMOVE_AUTO_CDRをコールした後、未使用列は後のステージで手動で削除したり、追加パラメータを使用してすぐに削除することもできます。詳細は、「表からの競合検出および解消の削除」を参照してください。

詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』ADD_AUTO_CDRプロシージャを参照してください

最新タイムスタンプの競合検出および解決では、行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. ADD_AUTO_CDR_COLUMN_GROUPプロシージャを実行して、表に1つ以上の列グループを指定します。
  4. 表をレプリケートする各Oracle Databaseに対して前述のステップを繰り返します。

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

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

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

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

この例では、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-26 表に対するデルタ競合検出および解決の構成

この例では、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-27 表に対する競合検出および解決の変更

この例では、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-28 列グループの変更

この例では、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-29 ツームストン行のパージ

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

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

ACDR表のオンライン再定義

Oracle Database 23aiでは、DBMS_REDEFINITIONパッケージを使用して表または列を再編成するときに、アプリケーションの相互作用を軽減できます。DBMS_REDEFINITIONパッケージを使用すると、次のタスクを実行できます。

  • 未使用列の削除。

  • 再編成、表領域の再設計およびパーティション化。

DBMS_REDFINITION.START_REDEF_TABLEは、暫定表に対する非表示のタイムスタンプ列を自動的に管理します。

DBMS_REDFINITIONパッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』DBMS_REDEFINITIONを参照してください。

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

Oracle Database 23ai以降では、AUTO_CDRが削除されるとAUTO_CDR関連の列がUNUSEDとマークされるため、表から完全に自動競合検出および解決(ACDR)を削除すると、表への影響が少なくなります。

REMOVE_AUTO_CDRプロシージャをコールした後、メンテナンス・ウィンドウで未使用列を手動で削除できます。これは、ALTER TABLE ... DROP COLUMN操作がリソースを大量に消費する大規模な表の場合に役立ちます。

REMOVE_AUTO_CDRプロシージャのコール時にすべてのAUTO_CDR内部列をすぐに削除する場合は、最初にADD_AUTO_CDRまたはALTER_AUTO_CDRプロシージャのadditional_optionsパラメータREMOVE_HIDDEN_COLUMNSを使用して表をマークする必要があります。

DBMS_GOLDENGATE_ADMパッケージのREMOVE_AUTO_CDRプロシージャを使用して、表をUNUSEDとしてタグ付けし、ブロックを最小限に抑えます。後のステージで、列を削除するか、列を保持するかを選択できます。

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

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

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

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

列を削除するには、ADD_AUTO_CDR.REMOVE_HIDDEN_COLUMNSフラグをADD_AUTO_CDRプロシージャのadditional_flagsパラメータとして使用します。

表内の非表示列の表示に使用できる例を次に示します。

次の問合せでは、DBA_UNUSED_COL_TABSパッケージを使用して、EMPLOYEES表に未使用列があるかどうかを判断します。

SELECT OWNER, TABLE_NAME, COUNT
  FROM DBA_UNUSED_COL_TABS
  WHERE OWNER = 'HR'
  AND TABLE_NAME = 'EMPLOYEES'
  ORDER BY OWNER, TABLE_NAME;
出力は次のように表示されます。
OWNER        TABLE_NAME    COUNT
--------    ------------ ----------
HR            EMPLOYEES      1  
次の問合せでは、EMPLOYEES表の列グループに対してACDRが削除されたときにシステムによってタグ付けされた非表示列をリストします。
SELECT OWNER, TABLE_NAME, COLUMN_ID, COLUMN_NAME, DATA_TYPE, HIDDEN_COLUMN
  FROM DBA_TAB_COLS
  WHERE OWNER = 'HR'
  AND TABLE_NAME = 'EMPLOYEES'
  AND HIDDEN_COLUMN = 'YES' AND USER_GENERATED= 'NO'
  ORDER BY OWNER, TABLE_NAME, COLUMN_ID;
出力は次のように表示されます。
OWNER        TABLE_NAME    COLUMN_ID  COLUMN_NAME      DATA_TYPE     HIDDEN_COLUMN  
------------ ------------ ---------- -------------    ------------ ---------------
HR           EMPLOYEES    SYS_C00014_22092220:30:52$   TIMESTAMP(6)       YES

列グループの削除

Oracle Database 23ai以降では、ACDR関連の列がUNUSEDとマークされているため、列グループから自動競合検出および解決(ACDR)を削除すると、表への影響が少なくなります。また、後のステージで、列を削除するか、列を保持するかを選択できます。

DBMS_GOLDENGATE_ADMパッケージのREMOVE_AUTO_CDR_COLUMN_GROUPプロシージャを使用して表をタグ付けし、ブロックを最小限に抑えます。「表からの競合検出および解消の削除」の例を参照してください。
  1. Oracle GoldenGate管理者としてインバウンド・サーバー・データベースに接続します。

  2. REMOVE_AUTO_CDR_COLUMN_GROUPプロシージャを列グループの名前を指定して実行します。

  3. 表をレプリケートする各Oracle Databaseに対して前述のすべてのステップを繰り返します。

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

この例では、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-32 表のデルタ競合検出および解決の削除

この例では、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-33 競合検出および解決のために構成された表に関する情報の表示

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

  • 各表の所有者

  • 各表の名前

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

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

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-34 列グループに関する情報の表示

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

  • 各表の所有者

  • 各表の名前

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

  • 列名。

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

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-35 列グループに関する情報の表示

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

  • 表の所有者。

  • 表名。

  • 列グループの名前

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

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