7 アクティブ/アクティブ構成のためのOracle GoldenGateの構成
内容は次のとおりです。
- アクティブ/アクティブ構成の概要
- アクティブ/アクティブ構成の考慮事項
- データ・ループの防止
- 競合の管理
- 追加情報
- アクティブ/アクティブ構成の作成
- 競合の検出および解決の構成
この章では、Oracle GoldenGateの競合検出および解決(CDR)機能を使用する方法について説明します。アクティブ/アクティブ構成のOracle GoldenGateでは、同じデータセットを持つ複数のデータベース間でデータの同期性を維持する必要があるため、競合検出および解決が必要です。
7.1 アクティブ/アクティブ構成の概要
Oracle GoldenGateでは、アクティブ/アクティブ型の双方向構成がサポートされます。この構成では、同一のデータセットが含まれる2つのシステムが存在し、アプリケーション・ユーザーはどちらのシステムでもそれらのデータを変更できます。Oracle GoldenGateは、両方のデータセットを最新状態に維持するため、トランザクション・データ変更を一方のデータベースから他方のデータベースにレプリケートします。
双方向構成では、各システムにアクティブなOracle GoldenGateプロセスの完全なセットがあります。Extractプロセスによって一方のシステムで取得されたデータは、他方のシステムに伝播され、ローカルReplicatプロセスによって適用されます。
この構成では、負荷分散がサポートされます。この機能は、ビジネス・アプリケーションが任意の2つのピアで同一である場合に、障害耐久力を確保するために使用できます。
Oracle GoldenGateでは、次のデータベースでアクティブ/アクティブ構成がサポートされます。
-
DB2(z/OSおよびLUW上)およびIBM i
-
MySQL
-
Oracle
-
PostgreSQL
-
SQL Server
7.2 アクティブ/アクティブ構成の考慮事項
アクティブ/アクティブ構成では、次の点を考慮する必要があります。また、使用中のデータベース・タイプに対応するOracle GoldenGateのインストレーションおよび構成のドキュメントを参照し、双方向構成をサポートする上で他になんらかの制限や要件がないか確認してください。
7.2.1 アプリケーション設計
アクティブ/アクティブ型のレプリケーションを使用する場合は、タイムゾーンを両方のシステムで同じにする必要があるため、そのタイムスタンプベースの競合解決および検出を動作できます。
アクティブ/アクティブ型のレプリケーションは、市販のパッケージ・ビジネス・アプリケーションでサポートされていない場合、それらのアプリケーションで使用することは推奨されません。これらのアプリケーションで障害となるのは次の点です。
-
パッケージ・アプリケーションには、Oracle GoldenGateでサポートされないオブジェクトおよびデータ型が含まれる可能性があります。
-
パッケージ・アプリケーションでは、ユーザーが制御できない自動DML操作が実行される可能性がありますが、その操作がOracle GoldenGateによってレプリケートされると、Replicatによる適用時に競合が発生します。
-
通常、ユーザーは、アクティブ/アクティブ型のレプリケーションに必要とされる変更を行うためのデータ構造を制御できません。
親トピック: アクティブ/アクティブ構成の考慮事項
7.2.2 キー
競合を正確に検出するためには、すべてのレコードは一意の非NULL識別子である必要があります。可能であれば、主キーを作成してください。不可能な場合は、一意キーを使用するか、MAP
パラメータおよびTABLE
パラメータのKEYCOLS
オプションを使用して代替キーを作成します。一意の識別子がないと、Oracle GoldenGateでは、WHERE
句で有効なすべての列が使用されますが、表に大量の列が含まれる場合、これによってパフォーマンスが低下します。
データ整合性を保持してエラーを防止するため、特定の表で使用するキーには次のことが求められます。
-
その特定の表が存在するすべてのデータベースで同じ列が含まれる必要があります。
-
データベース間の対応する行の各セットで同じ値が含まれる必要があります。
親トピック: アクティブ/アクティブ構成の考慮事項
7.2.3 データベース生成による値
双方向構成では、データベース生成による順序値(Oracle順序など)をレプリケートしないでください。値の範囲は、重複しないように各システムで異なっている必要があります。たとえば、2つのデータベースが存在する環境では、一方のサーバーで偶数値を生成し、他方で奇数値を生成します。n個のサーバーが存在する環境では、各キーを異なる値で開始し、環境内のサーバーの数を単位として値を増分します。この方法は、すべてのタイプのアプリケーションまたはデータベースに使用できるわけではありません。アプリケーションが対応している場合、値に位置識別子を追加して強制的に一意性を確保できます。
親トピック: アクティブ/アクティブ構成の考慮事項
7.2.4 データベース構成
データベースの1つを、信頼できるソースとして指定する必要があります。これは、初期同期フェーズや必要な後続のすべての再同期時に他のデータベースの導出元になるプライマリ・データベースおよびそのホスト・システムです。信頼できるソースのデータは定期的にバックアップしてください。
親トピック: アクティブ/アクティブ構成の考慮事項
7.3 データ・ループの防止
双方向構成では、あるシステムから別のシステムにレプリケートされたSQL変更は、最初のシステムに再度レプリケートされないようにする必要があります。そうしないと、システム間でデータの移動が繰り返され、次の例のように無限ループに陥ります。
-
ユーザー・アプリケーションがシステムAのある行を更新します。
-
Extractは、システムAでその行を抽出してシステムBに送信します。
-
Replicatは、システムBでその行を更新します。
-
Extractは、システムBでその行を抽出してシステムAに戻します。
-
その行がシステムAに適用されます(2回目)。
-
このループが無限に継続します。
データのループバックを防止するには、状況に応じて次の処理を行う必要があります。
-
Replicatによって生成されるSQL操作を取得しないようにします。ただし、Extractのパラメータ・ファイルに指定されているオブジェクトがビジネス・アプリケーションに含まれる場合は、それらのビジネス・アプリケーションによって生成されるSQL操作の取得を有効化します。
-
ローカルReplicatトランザクションを識別します(Extractプロセスでそれらのトランザクションを無視するため)。
7.3.1 Replicatトランザクションの識別
Replicatトランザクションを識別するようにExtractを構成するには、Extractがデータを取得するデータベースについて、次の手順に従います。
内容は次のとおりです。
7.3.1.1 DB2 z/OS、DB2 LUWおよびDB2 for i
Extractのパラメータ・ファイルで次のパラメータ文を使用して、Replicatユーザー名を識別します。
TRANLOGOPTIONS EXCLUDEUSER user
このパラメータ文によって、このユーザーにより生成されるすべてのDDLおよびDMLトランザクションがReplicatトランザクションとしてマークされます。ユーザー名は、Extractによって読み取られるトランザクション・レコードに含まれます。
親トピック: Replicatトランザクションの識別
7.3.1.2 MySQL
Extractのパラメータ・ファイルで次のパラメータ文を使用して、Replicatのチェックポイント表の名前を識別します。
TRANLOGOPTIONS FILTERTABLE table_name
Replicatは、その各トランザクションの終了時に、チェックポイント手順の一環としてチェックポイント表にチェックポイントを書き込みます。(これは、ADD CHECKPOINTTABLE
コマンドを使用して作成される表です。)各Replicatトランザクションにこの表への書込みが含まれるため、この表を使用して双方向構成のReplicatトランザクションを識別できます。FILTERTABLE
によってチェックポイント表の名前を識別し、その表に対する操作が含まれるトランザクションをExtractで無視するようにします。
親トピック: Replicatトランザクションの識別
7.3.1.3 PostgreSQLおよびSQL Server
Extractのパラメータ・ファイルで次のパラメータ文を使用して、Replicatのチェックポイント表の名前を識別し、ADD TRANDATA
コマンドによるサプリメンタル・ロギングに対してReplicatのチェックポイント表が有効になっていることを確認します。
TRANLOGOPTIONS FILTERTABLE table_name
Replicatは、その各トランザクションの終了時に、チェックポイント手順の一環としてチェックポイント表にチェックポイントを書き込みます。(これは、ADD CHECKPOINTTABLE
コマンドを使用して作成される表です。)各Replicatトランザクションにこの表への書込みが含まれるため、この表を使用して双方向構成のReplicatトランザクションを識別できます。FILTERTABLE
によってチェックポイント表の名前を識別し、その表に対する操作が含まれるトランザクションをExtractで無視するようにします。
親トピック: Replicatトランザクションの識別
7.3.1.4 Oracle
Oracle環境でReplicatトランザクションを識別する方法は複数あります。Replicatがクラシックまたは統合モードである場合は、次のパラメータを使用します。
-
Replicatはデフォルトで00のタグを設定します。Replicatのパラメータ・ファイルで
SETTAG
オプションを指定してDBOPTIONS
を使用し、Replicatで設定されるタグを変更します。Replicatは、指定した値(これらのトランザクションをREDOストリーム内で識別)で適用されるトランザクションにタグ付けします。有効値は、16進数で構成される単一のTAG値です。
-
Extractパラメータ・ファイルで
TRANLOGOPTIONS
パラメータをEXCLUDETAG
オプションとともに使用します。Extractに関連付けられたログマイニング・サーバーは、SETTAG
値のタグが付いたREDOを除外します。Replicatのパラメータ・ファイルで
SETTAG
を設定する方法は次のとおりです。DBOPTIONS SETTAG 0935
Extractのパラメータ・ファイルで
EXCLUDETAG
を設定する方法は次のとおりです。TRANLOGOPTIONS EXCLUDETAG 0935
複数のタグを除外する場合は、個別の
TRANLOGOPTIONS EXCLUDETAG
文をそれぞれ指定する必要があります。
トランザクション名またはReplicatユーザーのユーザーIDを使用して、Replicatトランザクションを識別することもできます。Extractの構成時に、どちらを無視するか選択できます。「Replicatトランザクションの取得の防止(Oracle)」を参照してください。
詳細は、『Oracle GoldenGateリファレンス』を参照してください。
親トピック: Replicatトランザクションの識別
7.3.2 Replicat操作の取得の防止
使用中のデータベースに応じて、Replicat操作を取得しないように明示的に指示する必要がある場合とない場合があります。
7.3.2.1 Replicatトランザクションの取得の防止(Oracle)
ReplicatによってOracleデータベースに適用されるSQLの取得を防止するために、Extractのキャプチャ・モードに応じて異なるオプションが用意されています。
-
Extractがクラシックまたは統合キャプチャ・モードである場合は、
TRANLOGOPTIONS
パラメータをEXCLUDETAG
tag
オプションとともに使用します。このパラメータを使用すると、Extractプロセスは、指定されたREDOタグの付いたトランザクションを無視します。タグ値の設定は、「Replicatトランザクションの識別」を参照してください。これはOracleの場合に推奨されるアプローチです。 -
Extractがクラシック・キャプチャ・モードである場合は、Extractの
TRANLOGOPTIONS
パラメータをEXCLUDEUSER
またはEXCLUDEUSERID
オプションとともに使用して、ReplicatがDDLおよびDMLトランザクションの適用に使用しているユーザー名またはユーザーIDを除外します。複数のEXCLUDEUSER
文を使用できます。指定されたユーザーは、GETREPLICATES
またはIGNOREREPLICATES
パラメータのルールの対象になります。詳細は、「Replicatトランザクションの取得の防止(他のデータベース)」を参照してください。
親トピック: Replicat操作の取得の防止
7.3.2.2 Replicatトランザクションの取得の防止(他のデータベース)
Replicatによって他のデータベース・タイプ(Extractがクラシック・キャプチャ・モードで動作する場合はOracleを含む)に適用されるSQLの取得を防止するには、次のパラメータを使用します。
-
GETAPPLOPS | IGNOREAPPLOPS
: Replicat以外のビジネス・アプリケーションによって生成されたデータ操作(DML)を、Extractが特定の証跡またはファイルに書き込む内容に含めるかどうかを制御します。 -
GETREPLICATES | IGNOREREPLICATES
: Replicatによって生成されたDML操作を、Extractが特定の証跡またはファイルに書き込む内容に含めるかどうかを制御します。
親トピック: Replicat操作の取得の防止
7.3.3 双方向構成でのDDLレプリケーション
Oracleデータベースでのみ現在サポートされているDDLの双方向レプリケートでは、他にも考慮すべき事項があります。詳細は、Oracle DatabaseのためのOracle GoldenGateの使用のDDLレプリケーション環境の管理 を参照してください。
親トピック: データ・ループの防止
7.4 競合の管理
アクティブ/アクティブ構成では、統一された競合解決手順をすべてのシステムに用意しておく必要があります。競合は即座に識別され、可能なかぎり自動的に処理される必要がありますが、様々なビジネス・アプリケーションがこの処理に関する独自の要件セットを持っています。
Oracle GoldenGateは非同期ソリューションであるため、個別のシステム上にある同一のデータセットに対して(ほぼ)同時に変更が行われた場合、競合が発生する可能性があります。競合は、同時変更のタイミングが次の非同期状態のいずれかにつながる場合に発生します。
-
Replicatが、一意性整合性制約(
PRIMARY KEY
制約やUNIQUE
制約など)に違反する挿入操作または更新操作を適用すると、一意性競合が発生します。この競合タイプの例としては、2つの異なるデータベースから2つのトランザクションが発生し、各トランザクションが同じ主キー値で表に行を挿入する場合があげられます。 -
Replicatが、同じ行への別の更新と競合する更新を適用すると、更新競合が発生します。更新競合が発生するのは、異なるデータベースから生じた2つのトランザクションがほぼ同時に同じ行を更新した場合です。証跡レコードに格納されている古い値(変更前の値)とターゲット・データベース内の同じ行の現行値との間に差異があると、Replicatは更新競合を検出します。
-
2つのトランザクションが異なるデータベースから生じ、一方が行を削除するのと同時にもう一方が同じ行を更新または削除すると、削除競合が発生します。この場合、その行は存在せず、更新も削除もできません。主キーが存在しないため、Replicatは行を見つけられません。
たとえば、データベースAのユーザーAがある行を更新し、データベースBのユーザーBが同じ行を更新するとします。ユーザーAのトランザクションがデータベースBに同期されるより前にユーザーBのトランザクションが実行されると、レプリケートされたトランザクションで競合が発生します。
3つのデータベースが関与するさらに複雑な例を基に、順序にまつわるさらに複雑な競合について説明します。A、B、Cという3つのデータベースがあるとします。あるユーザーがデータベースAに行を挿入すると、その行はデータベースBにレプリケートされます。次に、別のユーザーがその行をデータベースBで変更すると、行の変更がデータベースCにレプリケートされます。Bからの行の変更が、データベースAからの行の挿入より前にデータベースCに到着した場合、Cは競合を検出します。
可能であれば、競合発生のすべての可能性を最小化または排除してください。そのいくつかの方法を次に示します。
-
各データベースで変更できる列を制限するようにアプリケーションを構成します。たとえば、地理的地域に基づいてアクセスを制限できます(異なる販売地域でその独自の顧客レコードのみを変更できるようにするなど)。別の例として、あるデータベースの顧客サービス・アプリケーションには顧客表の
NAME
列とADDRESS
列の変更のみを許可し、別のデータベースの財務アプリケーションにはBALANCE
列の変更のみを許可することが可能です。どちらの例の場合でも、同じレコードの同時更新による競合は発生しません。 -
同期のレイテンシを最小限に抑えます。データベースAのユーザーAとデータベースBのユーザーBがほぼ同時に同じ行を更新しても、ユーザーBのトランザクションが完了する前にユーザーAのトランザクションがターゲット行にレプリケートされていれば、競合は回避されます。Oracle GoldenGateプロセスのパフォーマンス向上のための推奨事項は、Oracle GoldenGateのパフォーマンスのチューニングを参照してください。
競合を回避するには、レプリケーション・レイテンシを最小限に抑える必要があります。競合が避けられない場合は、Oracle GoldenGateの競合検出および解決(CDR)機能または独自に開発した方法によって、競合をすみやかに特定し、可能なかぎり自動的に解決する必要があります。独自の方法は、SQLEXEC
とユーザー・イグジット機能を通じてOracle GoldenGate処理に統合できます。Oracle GoldenGateを使用した競合の処理の詳細は、競合の検出および解決の構成を参照してください。
Oracleデータベースには、自動競合検出解決(CDR)機能があります。詳細は、『Oracle Database XStreamガイド』のOracle GoldenGate自動競合検出および解決に関する項を参照してください。
7.5 追加情報
次のドキュメントには、Oracle GoldenGateの構成に関連する追加情報が記載されています。
-
その他のシステム要件、プロセス構成およびデータベースの設定要件については、使用中のデータベース・タイプに対応するOracle GoldenGateのインストレーションおよび構成のドキュメントを参照してください。
-
Oracle GoldenGateの変更取得および配信グループの構成方法の詳細は、オンライン変更同期の構成を参照してください。
-
Oracle GoldenGateのその他のチューニング・オプションは、Oracle GoldenGateのパフォーマンスのチューニングを参照してください。
-
Oracle GoldenGateのコマンドとパラメータの構文の詳細および説明は、『Oracle GoldenGateリファレンス』を参照してください。
7.6 アクティブ/アクティブ構成の作成
作成するオブジェクトのビジュアル表現は、図7-*を参照してください。
7.6.1 両システムの前提条件
両方のシステムで次の前提条件を実行します。
-
Replicatのチェックポイント表を作成します(Oracle統合Replicatを使用していない場合)。手順については、「チェックポイント表の作成」を参照してください。
-
Managerプロセスの構成手順については、Managerおよびネットワーク通信の構成を参照してください。
親トピック: アクティブ/アクティブ構成の作成
7.6.2 プライマリ・システムからセカンダリ・システムに対する構成
次のステップでは、プライマリ・システムからセカンダリ・データベースへのデータ送信に必要なプロセスを追加します。
プライマリExtractグループを構成する手順
プライマリ・システムで次のステップを実行します。
-
ADD EXTRACT
コマンドを使用してプライマリExtractグループを作成します。説明上、このグループをext_1
と呼びます。ADD EXTRACT exte, {TRANLOG | INTEGRATED TRANLOG}, BEGIN time
-
ADD EXTTRAIL
コマンドを使用してローカル証跡を追加します。説明上、この証跡をtrail_east
と呼びます。ADD EXTTRAIL trail_east, EXTRACT exte
EXTRACT
では、この証跡に書込みを行うext_1
グループを指定します -
EDIT PARAMS
コマンドを使用してext_1
グループのパラメータ・ファイルを作成します。次のパラメータと、データベース環境に適用する他のパラメータを含めます。考えられるその他の必須パラメータの詳細は、使用中のデータベースに対応するOracle GoldenGateインストレーションおよびセットアップ・ガイドを参照してください。-- Identify the Extract group: EXTRACT exte -- Specify database login information as needed for the database: [SOURCEDB dsne][, USERIDALIAS
alias
] -- Specify the local trail that this Extract writes to -- and the encryption algorithm: ENCRYPTTRAILalgorithm
EXTTRAILtrail_east
-- Exclude Replicat transactions. Uncomment ONE of the following: -- DB2 z/OS, DB2 LUW, DB2 IBM i, and Oracle: -- TRANLOGOPTIONS EXCLUDEUSERReplicat_user
-- Oracle integrated capture: -- EXCLUDETAGtag
-- SQL Server: -- TRANLOGOPTIONS FILTERTABLE schema.checkpointtable" -- -- Teradata: -- SQLEXEC 'SET SESSION OVERRIDE REPLICATION ON;' -- SQLEXEC 'COMMIT;' -- Log all scheduling columns for CDR and if using integrated Replicat LOGALLSUPCOLS -- Specify tables to be captured and (optional) columns to fetch: TABLE [container.|catalog.]owner.* [, FETCHCOLS cols | FETCHCOLSEXCEPT cols];
データ・ポンプを構成する手順
プライマリ・システムで次のステップを実行します。
-
ADD EXTRACT
コマンドを使用してデータ・ポンプ・グループを作成します。説明上、このグループをpumpe
と呼びます。ADD EXTRACT pumpe, EXTTRAILSOURCE ea, BEGIN time
EXTTRAILSOURCE
では、データソースとしてea
を指定します。 -
ADD RMTTRAIL
コマンドを使用して、セカンダリ・システムに作成するリモート証跡を追加します。説明上、この証跡をer
と呼びます。ADD RMTTRAIL er, EXTRACT pumpr
EXTRACT
では、この証跡に書込みを行うpump_1
データ・ポンプを指定します。その他の
ADD RMTTRAIL
オプションは、『Oracle GoldenGateリファレンス』を参照してください。EDIT PARAMS
コマンドを使用してpumpr
グループのパラメータ・ファイルを作成します。次のパラメータと、データベース環境に適用する他のパラメータを含めます。-- Identify the data pump group: EXTRACT pumpe -- Specify database login information as needed for the database: [SOURCEDB dsne][, USERIDALIAS alias] -- Decrypt the data only if the data pump must process it. -- DECRYPTTRAIL -- Specify the name or IP address of the secondary system -- and optional encryption of data over TCP/IP: RMTHOSTOPTIONS system_2, MGRPORT port_number, ENCRYPT encryption_options -- Specify remote trail and encryption algorithm on secondary system: ENCRYPTTRAIL algorithm RMTTRAIL remote_trail_1 -- Specify tables to be captured: TABLE [container.|catalog.]owner.*;
Replicatグループを構成する手順
セカンダリ・システムで次のステップを実行します。
-
DBLOGIN
コマンドを使用してデータベースに接続した後、Replicatチェックポイント表を作成します。『Oracle GoldenGateコマンド・ライン・インタフェース・リファレンス』のADD CHECKPOINTTABLE
を参照してください。 -
次のコマンドを実行します。
ADD CHECKPOINTTABLE schema.checkpointtable
-
ADD REPLICAT
コマンドを使用してReplicatグループを作成します。説明上、このグループをrepe
と呼びます。ADD REPLICAT repe [, PARALLEL | INTEGRATED | COORDINATED [MAXTHREADS number]] , EXTTRAIL er, CHECKPOINTTABLE schema.checkpointtable
EXTTRAIL
では、このReplicatが読み取る証跡としてremote_trail_1
を指定します。 -
EDIT PARAMS
コマンドを使用してrep_1
グループのパラメータ・ファイルを作成します。次のパラメータと、データベース環境に適用する他のパラメータを含めます。考えられるその他の必須パラメータの詳細は、使用中のデータベースに対応するOracle GoldenGateインストレーションおよびセットアップ・ガイドを参照してください。-- Identify the Replicat group: REPLICAT repe -- Specify database login information as needed for the database: [TARGETDB dsnw][, USERIDALIAS alias] -- Specify error handling rules: REPERROR (error, response) -- Set redo tag for Oracle only replicat via settag -- Default is 00. SETTAG tag_value -- Valid for Oracle only. Specify tables for delivery, threads if coordinated Replicat -- and conflict-resolution: MAP [container.|catalog.]owner.*, TARGET owner.*, COMPARECOLS (ON operation {ALL | KEY | KEYINCLUDING (col_list) | ALLEXCLUDING (col_list)}), RESOLVECONFLICT (conflict type (resolution_name, resolution_type COLS (col[,...])) [, THREAD (thread_ID)] [, THREADRANGE (thread_range[, column_list])] ; -- Specify mapping of exceptions to exceptions table: MAP [container.|catalog.]owner.*, TARGET owner.exceptions, EXCEPTIONSONLY;
親トピック: アクティブ/アクティブ構成の作成
7.6.3 セカンダリ・システムからプライマリ・システムに対する構成
次のステップでは、セカンダリ・システムからプライマリ・データベースへのデータ送信に必要なプロセスを追加します。
プライマリExtractグループを構成する手順
セカンダリ・システムで次のステップを実行します。
ノート:
この手順は、これまでに作成した構成を逆にするイメージです。
-
ADD EXTRACT
コマンドを使用してプライマリExtractグループを作成します。説明上、このグループをextn
と呼びます。ADD EXTRACT extn, {TRANLOG | INTEGRATED TRANLOG}, BEGIN time
-
ADD EXTTRAIL
コマンドを使用してローカル証跡を追加します。説明上、この証跡をen
と呼びます。ADD EXTTRAIL en, EXTRACT extn
Extractでは、この証跡に書込みを行う
extn
グループを指定します。 -
EDIT PARAMS
コマンドを使用してextn
グループのパラメータ・ファイルを作成します。次のパラメータと、データベース環境に適用する他のパラメータを含めます。考えられるその他の必須パラメータの詳細は、使用中のデータベースに対応するOracle GoldenGateインストレーションおよびセットアップ・ガイドを参照してください。-- Identify the Extract group: EXTRACT extn -- Specify database login information as needed for the database: [SOURCEDB dsnn][, USERIDALIAS alias] -- Specify the local trail that this Extract writes to -- and the encryption algorithm: ENCRYPTTRAIL algorithm EXTTRAIL en -- Exclude Replicat transactions. Uncomment ONE of the following: -- Db2 z/OS, Db2 LUW, Db2 IBM i, and Oracle: -- TRANLOGOPTIONS EXCLUDEUSER Replicat_user -- Oracle integrated capture: -- EXCLUDETAG tag -- SQL Server: -- TRANLOGOPTIONS EXCLUDETRANS FILTERTABLE schema.checkpointtable -- Oracle: -- TRACETABLE trace_table_name -- Log all scheduling columns for CDR and if using integrated Replicat LOGALLSUPCOLS -- Specify tables to be captured and (optional) columns to fetch: TABLE [container.|catalog.]owner.* [, FETCHCOLS cols | FETCHCOLSEXCEPT cols];
ノート:
Oracle DBFSデータをレプリケートするには、各ノードの
TABLE
文で、内部的に生成されたローカルの読取り/書込みDBFS表を指定します。これらの表を識別し、Oracle GoldenGateによる伝播が行われるようにDBFSを構成する方法の詳細は、『Oracle DatabaseのためのOracle GoldenGateの使用』の必要なパッチの適用に関する項を参照してください。
データ・ポンプを構成する手順
セカンダリ・システムで次のステップを実行します。
-
ADD EXTRACT
コマンドを使用してデータ・ポンプ・グループを作成します。説明上、このグループをpumpn
と呼びます。ADD EXTRACT pumpn, EXTTRAILSOURCE en, BEGIN time
EXTTRAILSOURCE
では、データソースとしてen
を指定します。 -
ADD RMTTRAIL
コマンドを使用して、プライマリ・システムに作成するリモート証跡を追加します。説明上、この証跡をrt
と呼びます。ADD RMTTRAIL rt, EXTRACT pumpn
EXTRACT
では、この証跡に書込みを行うpumpn
データ・ポンプを指定します。 -
EDIT PARAMS
コマンドを使用してpump_2
グループのパラメータ・ファイルを作成します。次のパラメータと、データベース環境に適用する他のパラメータを含めます。-- Identify the data pump group: EXTRACT
pumpn
-- Specify database login information as needed for the database: [SOURCEDB dsnn][, USERIDALIAS alias] -- Decrypt the data only if the data pump must process it. -- DECRYPTTRAIL -- Specify the name or IP address of the primary system -- and optional encryption of data over TCP/IP: RMTHOSTOPTIONS system_1, MGRPORT port_number, ENCRYPT encryption_options -- Specify the remote trail and encryption algorithm on the primary system: ENCRYPTTRAIL algorithm RMTTRAIL rt -- Specify tables to be captured: TABLE [container.|catalog.]owner.*;ノート:
Oracle DBFSデータをレプリケートするには、各ノードの
TABLE
文で、内部的に生成されたローカルの読取り/書込みDBFS表を指定します。これらの表を識別して、Oracle GoldenGateによる伝播が行われるようにDBFSを構成する方法の詳細は、『Oracle DatabaseのためのOracle GoldenGateの使用』のDBFSファイル・システムの構成に関する項を参照してください。
Replicatグループを構成する手順
プライマリ・システムで次のステップを実行します。
-
DBLOGIN
コマンドを使用してデータベースに接続した後、Replicatチェックポイント表を作成します。『Oracle GoldenGateコマンド・ライン・インタフェース・リファレンス』のADD CHECKPOINTTABLE
を参照してください。 -
次のコマンドを実行します。
ADD CHECKPOINTTABLE schema.checkpointtable
-
ADD REPLICAT
コマンドを使用してReplicatグループを作成します。説明上、このグループをreps
と呼びます。ADD REPLICAT reps [, PARALLEL | INTEGRATED | COORDINATED [MAXTHREADS number]] , EXTTRAIL
rt
, CHECKPOINTTABLE schema.checkpointtableEXTTRAIL
では、このReplicatが読み取る証跡としてremote_trail_1
を指定します。 -
EDIT PARAMS
コマンドを使用してrep_2
グループのパラメータ・ファイルを作成します。次のパラメータと、データベース環境に適用する他のパラメータを含めます。-- Identify the Replicat group: REPLICAT reps -- Specify database login information as needed for the database: [TARGETDB dsns][, USERIDALIAS alias] -- Specify error handling rules: REPERROR (error, response) -- Specify tables for delivery, threads if coordinated Replicat -- and conflict-resolution: MAP [container.|catalog.]owner.*, TARGET owner.*, COMPARECOLS (ON operation {ALL | KEY | KEYINCLUDING (col_list) | ALLEXCLUDING (col_list)}), RESOLVECONFLICT (conflict type (resolution_name, resolution_type COLS (col[,...])) [, THREAD (thread_ID)] [, THREADRANGE (thread_range[, column_list])] ; -- Specify mapping of exceptions to exceptions table: MAP [container.|catalog.]owner.*, TARGET owner.exceptions, EXCEPTIONSONLY;
ノート:
Oracle DBFSデータをレプリケートするには、各ノードの
TABLE
文で、内部的に生成されたローカルの読取り/書込みDBFS表を指定します。
親トピック: アクティブ/アクティブ構成の作成
7.7 競合の検出および解決の構成
内容は次のとおりです。
- Oracle GoldenGate CDR機能の概要
- エラー処理のためのOracle GoldenGateパラメータ・ファイルの構成
- 競合解決のためのOracle GoldenGateパラメータ・ファイルの構成
- 必要な列値をExtractで使用可能にする方法
- Oracle GoldenGate CDRの構成
- CDRの例1: USEMAX、OVERWRITE、DISCARDによるすべての競合タイプの処理
- CDRの例2: USEDELTAおよびUSEMAXによるUPDATEROWEXISTSの処理
- CDRの例3: USEDELTA、USEMAXおよびIGNOREによるUPDATEROWEXISTSの処理
7.7.1 Oracle GoldenGate CDR機能の概要
Oracle GoldenGateの競合検出および解決(CDR)は、次の処理を行う基本的な競合解決ルーチンを備えています。
-
INSERT
の一意性競合を解決します。 -
行は存在するが、1つ以上の列の変更前イメージがデータベースの現行値と異なる場合に発生する、
UPDATE
の「データが見つからない」競合を解決します。 -
行が存在しない場合に発生する、
UPDATE
の「データが見つからない」競合を解決します。 -
行は存在するが、1つ以上の列の変更前イメージがデータベースの現行値と異なる場合に発生する、
DELETE
の「データが見つからない」競合を解決します。 -
行が存在しない場合に発生する、
DELETE
の「データが見つからない」競合を解決します。
競合検出および解決(CDR)を使用するには、ターゲット・データベースがWindows、Linux、UNIXのいずれかのシステムに配置されている必要があります。これは、NonStopプラットフォーム上のデータベースに対してはサポートされません。
CDRは、次のようなスカラー・データ型をサポートしています。
-
NUMERIC
-
DATE
-
TIMESTAMP
-
CHAR/NCHAR
-
VARCHAR/ NVARCHAR
つまり、これらの列タイプは、COMPARECOLS
パラメータで使用でき、また、RESOLVECONFLICT
パラメータのUSEMIN
およびUSEMAX
オプションの解決列として使用できます。RESOLVECONFLICT
のUSEDELTA
オプションに使用できるのは、NUMERIC
列のみです。CDRは、LOB、抽象データ型(ADT)またはユーザー定義型(UDT)を含む列に使用しないでください。
ReplicatがBATCHSQL
モードで動作する場合、競合解決は実行されません。BATCHSQL
モードで競合が発生すると、ReplicatはGROUPTRANSOPS
モードに戻り、さらに単一トランザクション・モードに戻ります。競合検出は3つのモードすべてで行われます。詳細は、『Oracle GoldenGateリファレンス』を参照してください。
親トピック: 競合の検出および解決の構成
7.7.2 エラー処理のためのOracle GoldenGateパラメータ・ファイルの構成
CDRをエラー処理と併用して、解決済のエラーとCDRで解決できなかったエラーを取得する必要があります。
7.7.2.1 追加データを例外表にマップするためのツール
次に示すのは、追加列に値を移入するためにCOLMAP
句で使用できるツールです。
-
ソース列の名前および定義が例外表のターゲット列のものと同一である場合、明示的にマッピングを行う名前のかわりに
USEDEFAULTS
キーワードを使用できます。それ以外の場合は、それらの列をCOLMAP
句でマッピングする必要があります。たとえば:COLMAP (exceptions_col1 = col1, [...])
-
ソース行の変更前イメージを例外表の列にマップするには、証跡レコードから列の変更前イメージを取得する
@BEFORE
変換関数を使用します。次の例は、@BEFORE
の使用方法を示しています。COLMAP (USEDEFAULTS, exceptions_col1 = @BEFORE (source_col1), & exceptions_col2 = @BEFORE (source_col2), [...])
-
ターゲット行の現行イメージを例外表の列にマップするには、
SQLEXEC
問合せを使用してイメージを取得し、COLMAP
句でqueryID.column
構文を使用して問合せの結果を例外表の列にマップします。COLMAP (USEDEFAULTS, name_current =
queryID
.name
, phone_current =queryID
.phone
, [...]) -
タイムスタンプ、データベース・エラー、その他の環境情報をマップするには、該当するOracle GoldenGate列変換関数を使用します。たとえば、次の例では実行時の現行タイムスタンプをマップしています。
res_date = @DATENOW ()
例外MAP
文のCOLMAP
句でこれらの機能を組み合せて詳細な例外表にデータを移入する方法は、例外表の追加の列を含むサンプル例外マッピングを参照してください。
これらの例で示したパラメータおよび列変換関数の使用方法と構文については、Oracle GoldenGateリファレンスfor Windows and UNIX を参照してください。
7.7.2.2 ソース列とターゲット列のみを含むサンプル例外マッピング
次のサンプル・パラメータ・ファイルは、以降のCDRの例で使用されるソース表およびターゲット表のエラー処理と単純な例外マッピングを示しています。この例でマップするのはソース列とターゲット列であり、追加の列はマップしません。次の理由から、この例の例外MAP
文にはCOLMAP
句は不要です。
-
ソースとターゲットの例外列は、名前と定義がそれぞれ同一です。
-
例外表に他の列がありません。
ノート:
この例では、Replicatパラメータ・ファイルに必要なその他のパラメータ(プロセス名やログイン資格証明、特定のデータベース・タイプに必要なオプションのパラメータなど)を意図的に省略してあります。改行を使用してパラメータ文を複数の行に分割するときは、各行の末尾でアンパサンド(&)を使用します。
-- REPERROR error handling: DEFAULT represents all error types. DISCARD -- writes operations that could not be processed to a discard file. REPERROR (DEFAULT, DISCARD) -- Specifies a discard file. DISCARDFILE /users/ogg/discards/discards.dsc, PURGE -- The regular MAP statement with the CDR parameters MAP fin.src, TARGET fin.tgt, & COMPARECOLS (ON UPDATE ALL, ON DELETE ALL), & RESOLVECONFLICT (UPDATEROWEXISTS, (DEFAULT, USEMAX (last_mod_time)), & RESOLVECONFLICT (INSERTROWEXISTS, (DEFAULT, USEMAX (last_mod_time)), & RESOLVECONFLICT (DELETEROWEXISTS, (DEFAULT, OVERWRITE)), & RESOLVECONFLICT (UPDATEROWMISSING, (DEFAULT, OVERWRITE)), & RESOLVECONFLICT (DELETEROWMISSING, (DEFAULT, DISCARD)), & ); -- Starts the exceptions MAP statement by mapping the source table to the -- exceptions table. MAP fin.src, TARGET fin.exception, & -- directs Replicat only to map operations that caused the error specified -- in REPERROR. EXCEPTIONSONLY, & -- directs Replicat to convert all the exceptions to inserts into the -- exceptions table. This is why there cannot be a primary key constraint -- on the exceptions table. INSERTALLRECORDS ;
7.7.2.3 例外表の追加の列を含むサンプル例外マッピング
次のサンプル・パラメータ・ファイルは、以降のCDRの例で使用されるソース表およびターゲット表のエラー処理と複雑な例外マッピングを示しています。この例では、例外表にソース表と同じ行があり、コンテキスト・データを取得するための追加の列もあります。
ノート:
この例では、Replicatパラメータ・ファイルに必要なその他のパラメータ(プロセス名やログイン資格証明、特定のデータベース・タイプに必要なオプションのパラメータなど)を意図的に省略してあります。改行を使用してパラメータ文を複数の行に分割するときは、各行の末尾でアンパサンド(&)を使用します。
-- REPERROR error handling: DEFAULT represents all error types. DISCARD -- writes operations that could not be processed to a discard file. REPERROR (DEFAULT, DISCARD) -- Specifies the discard file. DISCARDFILE /users/ogg/discards/discards.dsc, PURGE -- The regular MAP statement with the CDR parameters MAP fin.src, TARGET fin.tgt, & COMPARECOLS (ON UPDATE ALL, ON DELETE ALL), & RESOLVECONFLICT (UPDATEROWEXISTS, (DEFAULT, USEMAX (last_mod_time)), & RESOLVECONFLICT (INSERTROWEXISTS, (DEFAULT, USEMAX (last_mod_time)), & RESOLVECONFLICT (DELETEROWEXISTS, (DEFAULT, OVERWRITE)), & RESOLVECONFLICT (UPDATEROWMISSING, (DEFAULT, OVERWRITE)), & RESOLVECONFLICT (DELETEROWMISSING, (DEFAULT, DISCARD)) ); -- Starts the exceptions MAP statement by mapping the source table to the -- exceptions table. MAP fin.src, TARGET fin.exception, & -- directs Replicat only to map operations that caused the error specified -- in REPERROR. EXCEPTIONSONLY, & -- directs Replicat to convert all the exceptions to inserts into the -- exceptions table. This is why there cannot be a primary key constraint -- on the exceptions table. INSERTALLRECORDS & -- SQLEXEC query to select the values from the target record before the -- Replicat statement is applied. These are mapped to the *_target -- columns later. SQLEXEC (id qry, query 'select name, phone, address, salary, balance, & comment, last_mod_time from fin.tgt where name = :p1', PARAMS(p1 = name )), & -- Start of the column mapping, specifies use default column definitions. COLMAP ( & -- USEDEFAULTS maps the source columns to the target exceptions columns -- that receive the after image that Replicat applied or tried to apply. -- In this case, USEDEFAULTS can be used because the names and definitions -- of the source and target exceptions columns are identical; otherwise -- the columns must be mapped explicitly in the COLMAP clause. USEDEFAULTS, & -- captures the timestamp when the resolution was performed. res_date = @DATENOW (), & -- captures and maps the DML operation type. optype = @GETENV ('LASTERR', 'OPTYPE'), & -- captures and maps the database error number that was returned. dberrnum = @GETENV ('LASTERR', 'DBERRNUM'), & -- captures and maps the database error that was returned. dberrmsge = @GETENV ('LASTERR', 'DBERRMSG'), & -- captures and maps the name of the target table tabname = @GETENV ('GGHEADER', 'TABLENAME'), & -- If the names and definitions of the source columns and the target -- exceptions columns were not identical, the columns would need to -- be mapped in the COLMAP clause instead of using USEDEFAULTS, as -- follows: -- name_after = name, & -- phone_after = phone, & -- address_after = address, & -- salary_after = salary, & -- balance_after = balance, & -- comment_after = comment, & -- last_mod_time_after = last_mod_time & -- maps the before image of each column from the trail to a column in the -- exceptions table. name_before = @BEFORE (name), & phone_before = @BEFORE (phone), & address_before = @BEFORE (address), & salary_before = @BEFORE (salary), & balance_before = @BEFORE (balance), & comment_before = @BEFORE (comment), & last_mod_time_before = @BEFORE (last_mod_time), & -- maps the results of the SQLEXEC query to rows in the exceptions table -- to show the current image of the row in the target. name_current = qry.name, & phone_current = qry.phone, & address_current = qry.address, & salary_current = qry.salary, & balance_current = qry.balance, & comment_current = qry.comment, & last_mod_time_current = qry.last_mod_time) ;
例外表の作成と例外マッピングの使用の詳細は、「DML操作中のReplicatエラーの処理」を参照してください。
現在のルーチンがすべての状況で予定どおり動作することを確認したら、解決ルーチンのオーバーヘッドを削減するために、例外表に記録されるデータの量を減らすことができます。
7.7.3 競合解決のためのOracle GoldenGateパラメータ・ファイルの構成
競合検出および解決をサポートするには、次のパラメータが必要です。
- Replicatパラメータ・ファイル内の
MAP
パラメータのCOMPARECOLS
オプションを使用して、ReplicatのWHERE
句で変更前の値とともに使用する列を指定します。変更前の値は、更新および削除の競合を検出するために、ターゲット・データベースの現行値と比較されます。(デフォルトでは、ReplicatはWHERE
句で主キーのみを使用しますが、これでは競合検出には不十分な場合があります)。 MAP
パラメータのRESOLVECONFLICT
オプションを使用して、様々な操作や競合タイプに対する競合解決ルーチンを指定します。RESOLVECONFLICT
をMAP
文で複数回使用すると、競合タイプごとに異なる解決を指定できます。ただし、同じ競合タイプについてRESOLVECONFLICT
を繰り返して使用することはできません。同じ競合は同じ最終結果となるように、すべてのデータベースで同一の競合解決手順を使用してください。1つの競合解決方法で、発生する可能性のあるすべての競合に対応できるわけではありません。障害のリスクを最小化するため、状況に応じて、論理的な優先順でコールできる複数のルーチンを作成する必要があります。
ノート:
表に主キーと他の一意索引または一意キーが含まれている場合は、他にも考慮すべき事項があります。COMPARECOLS
パラメータとRESOLVECONFLICT
パラメータで自動ルーチンが指定されている場合、一貫した方法で各行を一意に識別する必要があります。一貫した方法で行を識別できない場合、競合解決時にエラーが発生します。このような状況では、主キー以外の一意キーを無効化するか、または、SQLEXEC
機能を使用してスローされたエラーを処理することで競合を解決できます。
これらのパラメータの詳細は、『Oracle GoldenGateリファレンス』を参照してください。これらのパラメータの詳細は、CDRの例1: USEMAX、OVERWRITE、DISCARDによるすべての競合タイプの処理以降の例を参照してください。
親トピック: 競合の検出および解決の構成
7.7.4 必要な列値をExtractで使用可能にする方法
CDRを使用するには、次の列値をログに記録して、Extractがその値を証跡に書き込めるようにする必要があります。
-
各レコードの完全な変更前イメージ。一部のデータベースは、変更前イメージをログ・レコードに記録できないため、サプリメンタル・ロギングを使用してこの処理を行うよう構成する必要があります。ほとんどのサポート対象データベースでは、
ADD TRANDATA
コマンドをこの目的で使用できます。 -
LOGALLSUPCOLS
パラメータを使用して、スケジュール列の完全な変更前イメージと変更後イメージが確実に証跡に書き込まれるようにします。スケジュール列は、主キー、一意索引および外部キーの列です。LOGALLSUPCOLS
を使用すると、Extractでは、UPDATE
操作の変更前イメージおよびUPDATE
とDELETE
の両操作のサプリメンタル・ロギング列すべての変更前イメージを証跡レコードに含めるようになります。
これらのパラメータとコマンドの詳細は、『Oracle GoldenGateリファレンス』を参照してください。これらのパラメータがCDRでどのように動作するかについては、「CDRの例1: USEMAX、OVERWRITE、DISCARDによるすべての競合タイプの処理」以降の例を参照してください。
親トピック: 競合の検出および解決の構成
7.7.5 Oracle GoldenGate CDRの構成
ソース・データベース、ターゲット・データベースおよびOracle GoldenGateを競合検出および解決のために構成するには、次のステップを実行します。ステップは次のとおりです。
親トピック: 競合の検出および解決の構成
7.7.5.1 CDR統計の表示
CDR機能には、競合解決の結果を表示するために次の方法が用意されています。
7.7.5.1.1 レポート・ファイル
Replicatは、CDR統計をレポート・ファイルに書き込みます。
Total CDR conflicts 7 CDR resolutions succeeded 6 CDR resolutions failed 1 CDR INSERTROWEXISTS conflicts 1 CDR UPDATEROWEXISTS conflicts 4 CDR UPDATEROWMISSING conflicts CDR DELETEROWEXISTS conflicts 1 CDR DELETEROWMISSING conflicts 1
親トピック: CDR統計の表示
7.7.5.1.2 GGSCI
CDR統計は、STATS REPLICAT
コマンドをREPORTCDR
オプションとともに使用して、GGSCIから表示することもできます。
STATS REPLICAT group
, REPORTCDR
親トピック: CDR統計の表示
7.7.5.1.3 列変換関数
次のCDR統計を取得し、必要に応じて、例外表にマップしたり、列変換関数からの入力を受け付ける他のOracle GoldenGateパラメータで使用できます。
-
Replicatで検出した競合の数
-
Replicatで解決した解決の数
-
Replicatで解決できなかった解決の数
これらの統計を取得するには、'STATS
'または'DELTASTATS
'情報タイプを指定して@GETENV
列変換関数を使用します。結果は、現在のReplicatセッションに基づいています。Replicatが停止して再起動すると、統計はリセットされます。
特定の表またはワイルドカードで指定された表のセットについて統計が返されます。
@GETENV ('STATS','TABLE','SCHEMA.TABLNAME','CDR_CONFLICTS') @GETENV ('STATS','TABLE','SCHEMA.TABLNAME','CDR_RESOLUTIONS_SUCCEEDED') @GETENV ('STATS','TABLE','SCHEMA.TABLNAME','CDR_RESOLUTIONS_FAILED')
Replicatパラメータ・ファイルのすべてのMAP
文のすべての表について統計が返されます。
@GETENV ('STATS','CDR_CONFLICTS') @GETENV ('STATS','CDR_RESOLUTIONS_SUCCEEDED') @GETENV ('STATS','CDR_RESOLUTIONS_FAILED')
前述の例の'STATS'
情報タイプを'DELTASTATS'
に置き換えると、前回の'DELTASTATS'
の実行以降の数が返されます。
@GETENV
の詳細は、『Oracle GoldenGateリファレンス』を参照してください。
親トピック: CDR統計の表示
7.7.6 CDRの例1: USEMAX、OVERWRITE、DISCARDによるすべての競合タイプの処理
この例では、USEMAX
解決、OVERWRITE
解決およびDISCARD
解決を使用して、すべての競合タイプを解決します。
- この例で使用する表
- 競合解決を指定したMAP文
- MAP文の説明
- エラー処理
- USEMAX解決によるINSERTROWEXISTSの処理
- USEMAX解決によるUPDATEROWEXISTSの処理
- OVERWRITE解決によるUPDATEROWMISSINGの処理
- DISCARD解決によるDELETEROWMISSINGの処理
- OVERWRITE解決によるDELETEROWEXISTSの処理
親トピック: 競合の検出および解決の構成
7.7.6.1 この例で使用する表
各例では同一のOracleデータベースを想定しています。
CREATE TABLE tgt( name varchar2(30) primary key, phone varchar2(10), address varchar2(100), salary number, balance number, comment varchar2(100), last_mod_time timestamp);
ソース・データベースでは、すべての列が補足的にログに記録されます。
ADD TRANDATA scott.src, COLS (name, phone, address, salary, balance, comment, last_mod_time);
7.7.6.2 競合解決を指定したMAP文
MAP fin.src, TARGET fin.tgt, COMPARECOLS (ON UPDATE ALL, ON DELETE ALL), RESOLVECONFLICT (UPDATEROWEXISTS, (DEFAULT, USEMAX (last_mod_time)), RESOLVECONFLICT (INSERTROWEXISTS, (DEFAULT, USEMAX (last_mod_time)), RESOLVECONFLICT (DELETEROWEXISTS, (DEFAULT, OVERWRITE)), RESOLVECONFLICT (UPDATEROWMISSING, (DEFAULT, OVERWRITE)), RESOLVECONFLICT (DELETEROWMISSING, (DEFAULT, DISCARD)), );
7.7.6.3 MAP文の説明
次に、MAP
文について説明します。
-
COMPARECOLS
では、更新および削除のReplicatWHERE
句において、証跡レコード内のすべての列の変更前イメージを使用します。 -
DEFAULT
では、すべての競合タイプの列グループとしてすべての列を使用します。そのため、解決はすべての列に適用されます。 -
INSERTROWEXISTS
競合には、USEMAX
解決を使用します。つまり、挿入時に行が存在する場合は、last_mod_time
列を解決列として使用し、証跡の値とデータベースの値のどちらが大きいかを判別します。証跡の値の方が大きい場合、レコードを適用しますが、挿入を更新に変更します。データベースの値の方が大きい場合、レコードを無視します。 -
UPDATEROWEXISTS
競合には、USEMAX
解決を使用します。つまり、更新時に行が存在する場合は、last_mod_time
列を解決列として使用します。証跡の値の方が大きい場合、更新を適用します。 -
USEMIN
とUSEMAX
を使用し、値がまったく同じ場合、RESOLVECONFLICT
はトリガーされず、受け取った行は無視されます。USEMINEQ
とUSEMAXEQ
を使用し、値がまったく同じ場合、解決策はトリガーされます。 -
DELETEROWEXISTS
競合には、OVERWRITE
解決を使用します。つまり、削除操作時に行が存在する場合は、削除を適用します。 -
UPDATEROWMISSING
競合には、OVERWRITE
解決を使用します。つまり、更新時に行が存在しない場合は、更新を挿入に変更して適用します。 -
DELETROWMISSING
競合には、DISCARD
解決を使用します。つまり、削除操作時に行が存在しない場合は、証跡レコードを破棄します。ノート:
USEMAX
のかわりにUSEMAXEQ
解決を使用すると、>=
条件を適用できます。詳細は、『Oracle GoldenGateリファレンス』を参照してください。
7.7.6.5 USEMAX解決によるINSERTROWEXISTSの処理
この例では、証跡とデータベースのレコードに対する適用可能な変更前イメージと変更後イメージを使用したUSEMAX
解決を説明しています。ソースとターゲットに行が存在するが、一部またはすべての行の値が異なる場合の挿入の解決方法を示します。
表7-1 USEMAX解決によるINSERTROWEXISTS競合の処理
イメージ | SQL | コメント |
---|---|---|
証跡内の変更前イメージ |
None (row was inserted on the source). |
該当なし |
証跡内の変更後イメージ |
name='Mary' phone='1234567890' address='Oracle Pkwy' salary=100 balance=100 comment=NULL last_mod_time='9/1/10 3:00' |
|
ターゲット・データベースのイメージ |
name='Mary' phone='111111' address='Ralston' salary=200 balance=500 comment='aaa' last_mod_time='9/1/10 1:00' |
|
Replicatによって適用され、競合を検出する初期 |
SQLバインド変数: 1)'Mary' 2)'1234567890' 3)'Oracle Pkwy' 4)100 5)100 6)NULL 7)'9/1/10 3:00' |
このSQLは、Maryに対する一意性競合を戻します。 |
競合を解決するためにReplicatによって適用される |
SQLバインド変数: 1)'1234567890' 2)'Oracle Pkwy' 3)100 4)100 5)NULL 6)'9/1/10 3:00' 7)'Mary' 8)'9/1/10 3:00' |
|
7.7.6.6 USEMAX解決によるUPDATEROWEXISTSの処理
この例では、証跡とデータベースのレコードに対する適用可能な変更前イメージと変更後イメージを使用したUSEMAX
解決を説明しています。ソースとターゲットに行が存在するが、一部またはすべての行の値が異なる場合の更新の解決方法を示します。
表7-2 USEMAX解決によるUPDATEROWEXISTS競合の処理
イメージ | SQL | コメント |
---|---|---|
証跡内の変更前イメージ |
name='Mary' phone='1234567890' address='Oracle Pkwy' salary=100 balance=100 comment=NULL last_mod_time='9/1/10 3:00' |
|
証跡内の変更後イメージ |
phone='222222' address='Holly' last_mod_time='9/1/10 5:00' |
|
ターゲット・データベースのイメージ |
name='Mary' phone='1234567890' address='Oracle Pkwy' salary=100 balance=600 comment='com' last_mod_time='9/1/10 6:00' |
|
Replicatによって適用され、競合を検出する初期 |
SQLバインド変数: 1)'222222' 2)'Holly' 3)'9/1/10 5:00' 4)'Mary' 5)'1234567890' 6)'Oracle Pkwy' 7)100 8)100 9)NULL 10)'9/1/10 3:00' |
|
競合を解決するためにReplicatによって適用される |
SQLバインド変数: 1)'Mary' 2)'222222' 3)'Holly' 4)100 5)100 6)NULL 7)'9/1/10 5:00' 8)'Mary' 9)'9/1/10 5:00' |
証跡レコードの |
7.7.6.7 OVERWRITE解決によるUPDATEROWMISSINGの処理
この例では、証跡とデータベースのレコードに対する適用可能な変更前イメージと変更後イメージを使用したOVERWRITE
解決を説明しています。ターゲット行が存在しない場合の解決方法を示します。論理的な解決は、行をターゲットに上書きして両方のデータベースを再度同期させることであり、この方法が使用されます。
表7-3 OVERWRITE解決によるUPDATEROWMISSING競合の処理
イメージ | SQL | コメント |
---|---|---|
証跡内の変更前イメージ |
name='Jane' phone='333' address='Oracle Pkwy' salary=200 balance=200 comment=NULL last_mod_time='9/1/10 7:00' |
該当なし |
証跡内の変更後イメージ |
phone='4444' address='Holly' last_mod_time='9/1/10 8:00' |
|
ターゲット・データベースのイメージ |
None (row for Jane is missing) |
|
Replicatによって適用され、競合を検出する初期 |
SQLバインド変数: 1)'4444' 2)'Holly' 3)'9/1/10 8:00' 4)'Jane' 5)'333' 6)'Oracle Pkwy' 7)200 8)200 9)NULL 10)'9/1/10 7:00' |
このSQLは、データが見つからないというエラーを戻します。 |
競合を解決するためにReplicatによって適用される |
SQLバインド変数: 1)'Jane' 2)'4444' 3)'Holly' 4)200 5)200 6)NULL 7)'9/1/10 8:00' |
|
7.7.6.8 DISCARD解決によるDELETEROWMISSINGの処理
この例では、証跡とデータベースのレコードに対する適用可能な変更前イメージと変更後イメージを使用したDISCARD
解決を説明しています。ターゲット行が存在しない場合の解決方法を示します。ソースに対する削除の場合、ターゲット行が存在しなくてもかまわない(ターゲット行はいずれにせよ削除する必要がある)ため、解決方法は証跡内のDELETE
操作を破棄することです。
表7-4 DISCARD解決によるDELETEROWMISSING競合の処理
イメージ | SQL | コメント |
---|---|---|
証跡内の変更前イメージ |
name='Jane' phone='4444' address='Holly' salary=200 balance=200 comment=NULL last_mod_time='9/1/10 8:00' |
該当なし |
証跡内の変更後イメージ |
None |
該当なし |
ターゲット・データベースのイメージ |
None (row missing) |
該当なし |
Replicatによって適用され、競合を検出する初期 |
SQLバインド変数: 1)'Jane' 2)'4444' 3)'Holly' 4)200 5)200 6)NULL 7)'9/1/10 8:00' |
このSQLは、データが見つからないというエラーを戻します。 |
競合を解決するためにReplicatによって適用されるSQL |
None |
|
7.7.6.9 OVERWRITE解決によるDELETEROWEXISTSの処理
この例では、証跡とデータベースのレコードに対する適用可能な変更前イメージと変更後イメージを使用したOVERWRITE
解決を説明しています。ここでは、ソース行は削除されたがターゲット行は存在する場合の解決方法を示します。この場合、OVERWRITE
解決により、ターゲットに削除が適用されます。
表7-5 OVERWRITE解決によるDELETEROWEXISTS競合の処理
イメージ | SQL | コメント |
---|---|---|
証跡内の変更前イメージ |
name='Mary' phone='222222' address='Holly' salary=100 balance=100 comment=NULL last_mod_time='9/1/10 5:00' |
該当なし |
証跡内の変更後イメージ |
None |
該当なし |
ターゲット・データベースのイメージ |
name='Mary' phone='1234567890' address='Oracle Pkwy' salary=100 balance=600 comment=com last_mod_time='9/1/10 7:00' |
行はターゲットに存在しますが、 |
Replicatによって適用され、競合を検出する初期 |
SQLバインド変数: 1)'Mary' 2)'222222' 3)'Holly' 4)100 5)100d 6)NULL 7)'9/1/10 5:00' |
変更前の値と現行値が異なるため、データが見つからないというエラーが発生します。 |
競合を解決するためにReplicatによって適用される |
SQLバインド変数: 1)'Mary' |
|
7.7.7 CDRの例2: USEDELTAおよびUSEMAXによるUPDATEROWEXISTSの処理
この例では、UPDATE
にターゲット行は存在するが、キー以外の列が異なる場合、影響を受ける列に応じて2つの異なる解決タイプを使用してこの状況を処理し、問題を解決します。
親トピック: 競合の検出および解決の構成
7.7.7.1 この例で使用する表
各例では同一のOracleデータベースを想定しています。
CREATE TABLE tgt( name varchar2(30) primary key, phone varchar2(10), address varchar2(100), salary number, balance number, comment varchar2(100), last_mod_time timestamp);
ソース・データベースでは、すべての列が補足的にログに記録されます。
ADD TRANDATA scott.src, COLS (name, phone, address, salary, balance, comment, last_mod_time);
7.7.7.2 MAP文
MAP fin.src, TARGET fin.tgt, COMPARECOLS (ON UPDATE KEYINCLUDING (address, phone, salary, last_mod_time), ON DELETE KEYINCLUDING (address, phone, salary, last_mod_time)), RESOLVECONFLICT ( UPDATEROWEXISTS, (delta_res_method, USEDELTA, COLS (salary)), (DEFAULT, USEMAX (last_mod_time)));
7.7.7.3 MAP文の説明
UPDATE
にターゲット行は存在するが、キー以外の列が異なるUPDATEROWEXISTS
競合には、列に応じて2つの異なる解決を使用します。
-
delta_res_method
解決では、salary
列に対してUSEDELTA
解決ロジックを使用し、値の変更が列の現行値に追加されるようにします。 -
DEFAULT
では、last_mod_time
列を解決列として使用し、表(デフォルトの列グループ)のその他すべての列に対しUSEMAX
解決ロジックを使用します。この列は行が変更されるたびに現在の時間で更新され、証跡内のこの列の値がターゲットの値と比較されます。証跡レコード内のlast_mod_time
の値がターゲット・データベースのlast_mod_time
の現行値より大きい場合は、name
、phone
、address
、balance
、comment
およびlast_mod_time
の変更がターゲットに適用されます。
COMPARECOLS
では、主キー(name
列)とaddress
、phone
、salary
、last_mod_time
の各列をUPDATE
操作とDELETE
操作の競合検出のための比較列として使用します。(balance
列とcomment
列は比較されません。)
ノート:
USEMAX
のかわりにUSEMAXEQ
解決を使用すると、>=
条件を適用できます。詳細は、『Oracle GoldenGateリファレンス』を参照してください。
7.7.7.4 エラー処理
例外表に対するエラー処理の例は、「エラー処理のためのOracle GoldenGateパラメータ・ファイルの構成」を参照してください。
表7-6 USEDELTAおよびUSEMAXによるUPDATEROWEXISTSの処理
イメージ | SQL | コメント |
---|---|---|
証跡内の変更前イメージ |
name='Mary' phone='1234567890' address='Oracle Pkwy' salary=100 balance=100 comment=NULL last_mod_time='9/1/10 3:00' |
|
証跡内の変更後イメージ |
phone='222222' address='Holly' salary=200 comment='new' last_mod_time='9/1/10 5:00' |
|
ターゲット・データベースのイメージ |
name='Mary' phone='1234567890' address='Oracle Pkwy' salary=600 balance=600 comment='com' last_mod_time='9/1/10 4:00' |
|
Replicatによって適用され、競合を検出する初期 |
SQLバインド変数: 1)'222222' 2)'Holly' 3)200 4)'new' 5)'9/1/10 5:00' 6)'Mary' 7)'1234567890' 8)'Oracle Pkwy' 9)100 10)'9/1/10 3:00' |
|
|
SQLバインド変数: 1)200 2)100 3)'Mary' |
600 + (200 - 100) = 700 |
|
SQLバインド変数: 1)'222222' 2)'Holly' 3)'new' 4)'9/1/10 5:00' 5)'Mary' 6)'9/1/10 5:00' |
|
7.7.8 CDRの例3: USEDELTA、USEMAXおよびIGNOREによるUPDATEROWEXISTSの処理
この例では、UPDATE
にターゲット行は存在するが、キー以外の列が異なる場合、影響を受ける列に応じて3つの異なる解決タイプを使用してこの状況を処理し、競合を解決します。
親トピック: 競合の検出および解決の構成
7.7.8.1 この例で使用する表
各例では同一のOracleデータベースを想定しています。
CREATE TABLE tgt( name varchar2(30) primary key, phone varchar2(10), address varchar2(100), salary number, balance number, comment varchar2(100), last_mod_time timestamp);
ソース・データベースでは、すべての列が補足的にログに記録されます。
ADD TRANDATA scott.src, COLS (name, phone, address, salary, balance, comment, last_mod_time);
7.7.8.2 MAP文
MAP fin.src, TARGET fin.tgt, COMPARECOLS (ON UPDATE ALLEXCLUDING (comment)), RESOLVECONFLICT ( UPDATEROWEXISTS, (delta_res_method, USEDELTA, COLS (salary, balance)), (max_res_method, USEMAX (last_mod_time), COLS (address, last_mod_time)), (DEFAULT, IGNORE));
7.7.8.3 MAP文の説明
-
UPDATE
にターゲット行は存在するが、キー以外の列が異なるUPDATEROWEXISTS
競合には、列に応じて2つの異なる解決を使用します。-
delta_res_method
解決では、salary
列とbalance
列に対してUSEDELTA
解決ロジックを使用し、各値の変更が各列の現行値に追加されるようにします。 -
max_res_method
解決では、address
列とlast_mod_time
列に対してUSEMAX
解決ロジックを使用します。last_mod_time
列が解決列です。この列は行が変更されるたびに現在の時間で更新され、証跡内のこの列の値がターゲットの値と比較されます。証跡レコード内のlast_mod_time
の値がターゲット・データベースのlast_mod_time
の現行値より大きい場合は、address
とlast_mod_time
の変更がターゲットに適用されます。そうでない場合、変更は無視され、ターゲット値が維持されます。 -
DEFAULT
では、表(デフォルトの列グループ)の残りの列(phone
とcomment
)に対してIGNORE
解決ロジックを使用します。Replicatでは、これらの列の変更は常に無視されます。
-
-
COMPARECOLS
では、comment
列を除くすべての列を、UPDATE
操作の競合検出における比較列として使用します。commentは更新のWHERE
句では使用されませんが、証跡レコード内に変更前イメージを持つその他すべての列が使用されます。ノート:
USEMAX
のかわりにUSEMAXEQ
解決を使用すると、>=
条件を適用できます。詳細は、『Oracle GoldenGateリファレンス』を参照してください。
7.7.8.4 エラー処理
例外表に対するエラー処理の例は、「エラー処理のためのOracle GoldenGateパラメータ・ファイルの構成」を参照してください。
表7-7 USEDELTA、USEMAXおよびIGNOREによるUPDATEROWEXISTSの処理
イメージ | SQL | コメント |
---|---|---|
証跡内の変更前イメージ |
name='Mary' phone='1234567890' address='Oracle Pkwy' salary=100 balance=100 comment=NULL last_mod_time='9/1/10 3:00 |
|
証跡内の変更後イメージ |
phone='222222' address='Holly' salary=200 comment='new' last_mod_time='9/1/10 5:00' |
|
ターゲット・データベースのイメージ |
name='Mary' phone='1234567890' address='Ralston' salary=600 balance=600 comment='com' last_mod_time='9/1/10 4:00' |
|
Replicatによって適用され、競合を検出する初期 |
SQLバインド変数: 1)'222222' 2)'Holly' 3)200 4)'new' 5)'9/1/10 5:00' 6)'Mary' 7)'1234567890' 8)'Oracle Pkwy' 9)100 10)100 11)'9/1/10 3:00' |
|
|
SQLバインド変数: 1)200 2)100 3)'Mary' |
|
|
SQLバインド変数: 1)'Holly' 2)'9/1/10 5:00' 3)'Mary' 4)'9/1/10 5:00' |
証跡レコード内の
|
|
SQLバインド変数: 1)'222222' 2)'new' 3)'Mary' |
|