処理のための表の準備
Oracle GoldenGate環境では、次の表属性に対応する必要があります。
トリガーおよびカスケード制約の無効化
ターゲットSybase表のトリガー、カスケード削除制約、カスケード更新制約を無効にするか、これらを変更してOracle GoldenGateデータベース・ユーザーによる変更を無視するようにします。Oracle GoldenGateは、トリガーまたはカスケード制約の結果生じるDMLをレプリケートします。同じトリガーまたは制約がターゲット表で有効にされる場合、レプリケートされたバージョンが原因で冗長になり、データベースによってエラーが返されます。次の例を考えてみます。この例では、ソース表はemp_srcおよびsalary_src、ターゲット表はemp_targおよびsalary_targです。
-
emp_srcに削除が発行されます。 -
それによって、削除が
salary_srcにカスケードされます。 -
Oracle GoldenGateが、両方の削除をターゲットに送信します。
-
親削除が最初に到達し、
emp_targに適用されます。 -
親削除は、削除を
salary_targにカスケードします。 -
salary_srcのカスケード削除が、salary_targに適用されます。 -
この行は、すでにステップ5で削除されているため、配置できません。
データベース・セッションの開始時にターゲット・トリガーを無効化するようにReplicatを構成するには、次のステップを実行します。
-
Replicatユーザーにレプリケーション・ロールを割り当てる。
-
Replicatパラメータ・ファイルのルート・レベルに、次のパラメータ文を追加します。
SQLEXEC "set triggers off"
行識別子の割当て
Oracle GoldenGateでは、レプリケートされた更新および削除に対応する正しいターゲット行を検出するために、ソース表およびターゲット表になんらかの形の一意の行識別子が必要です。
キーのない表での行の変更の制限
ターゲット表に主キーまたは一意キーがない場合は、重複する行が存在する可能性があります。Oracle GoldenGateで更新または削除されるターゲット表の行数が多くなりすぎ、ソース・データとターゲット・データの同期がとれなくなる可能性があります。警告するエラー・メッセージは表示されません。更新される行数を制限するには、Replicatのパラメータ・ファイルで、DBOPTIONSパラメータをLIMITROWSオプションとともに使用します。LIMITROWSを使用すると、処理されるのは1行のみのため、ターゲット・システムでのOracle GoldenGateのパフォーマンスが向上することがあります。
暗号化されたデータのレプリケート
Oracle GoldenGateは、システム暗号化 パスワードで暗号化された列をサポートしていますが、ユーザー定義パスワードで暗号化された列はサポートされていません。Oracle GoldenGateの次の制限事項について、データの取得元となる表を確認します。
-
暗号化された列を含む表には、主キーまたは一意のキーが必要です。
-
暗号化を使用する列を、主キーの一部にすることはできません。
暗号化された列は、データ・ファイルおよびログ内で暗号化されるので、抽出は、データベースからクリアテキスト値をフェッチするように構成する必要があります。このフェッチをトリガーするには、ExtractのTABLEパラメータのFETCHCOLSオプションおよびFETCHMODCOLS[EXCEPT]オプションを使用します。FETCHCOLSでは、ログに含まれていない値のフェッチが強制的に行われ、FETCHMODCOLSまたはFETCHMODCOLS[EXCEPT]によってログに含まれている値のフェッチが強制的に行われます。これらのパラメータを一緒に使用することで、暗号化された列が常にデータベースからフェッチされるようになります。
暗号化をサポートするようにExtractを構成する方法の例を次に示します。この例で、暗号化列はcardnumです。
TABLE ab.payments, FETCHCOLS (cardnum), FETCHMODCOLS (cardnum);
トランザクション・ログの準備
DML操作をキャプチャするため、Oracle GoldenGateはオンライン・ログを読み取ります。Oracle GoldenGateの処理の継続性および完全性を確保するには、次の項の指示に従いログを構成する必要があります。
2次切捨てポイントの初期化
Oracle GoldenGateのExtractプロセスを実行する前に、ソース・システムで2次ログ切捨てポイントを設定します。Extractでは、2次切捨てポイントを使用して未処理のデータを識別します。
2次切捨てポイントを初期化するには、sa_role権限を持つユーザーとしてデータベースにログオンし、次のコマンドを発行します。
dbcc settrunc( 'ltm', valid )
デフォルトでは、Extractは2次切捨てポイントを一度設定すると管理します。Extractを停止する時間が必要以上に長引きかないようにしてください。長引いた場合はログがいっぱいになり、データベースが停止されます。この問題を解決する唯一の方法は、2次切捨てポイントを無効にしてOracle GoldenGateの外側で2次切捨てポイントを管理し、トランザクション・ログをパージことです。Extractでまだ処理されていないデータが失われ、ソース・データとターゲット・データの再同期化が必要になります。
2次切捨て点の管理方法を制御するには、TRANLOGOPTIONSパラメータを使用します。詳細は、『Oracle GoldenGate for Windows and UNIXリファレンス』を参照してください。
ログのサイズ設定と保持
Extractを停止または計画外の停止が発生した後にExtractがチェックポイントから再開できるように、ソース・システムに十分なログ・データを保持します。Extractでは、コミットされていない最も古い作業ユニットの開始点を含むログと、それ以降のすべてのログにアクセスできる必要があります。Extractのチェックポイントの場所を決定するには、INFO EXTRACTコマンドを使用します。INFO EXTRACTの詳細は、『Oracle GoldenGate for Windows and UNIXリファレンス』に関する項を参照してください。
処理中にExtractが必要とするデータが、オンラインまたはバックアップ・ログのいずれかに保存されていない場合は、次のいずれかの修正処理が必要になる場合があります。
-
ログ・データが使用できる後の時点から取得するようにExtractを変更する必要がある場合があります(さらに、ターゲットでデータ損失があれば受け入れます)。これは、
ALTER EXTRACTコマンドを使用して実行できます。 -
ソースおよびターゲット表を再同期してから、Oracle GoldenGate環境を再度起動する必要がある場合があります。
古いアーカイブ・ファイルがソース・システムの新しいバックアップによって上書きされる原因となるバックアップ・オプションまたはアーカイブ・オプションを使用していないことを確認します。新しいバックアップは、古い名前とは異なる名前の別のファイルにしてください。これにより、Extractが特定のログを探す場合にそれがすでに存在し、さらにサポート事例に必要な場合にデータが使用できるようになります。
トランザクション・ロギングの有効化
ADD TRANDATAコマンドを使用して、レプリケーション用に各ソース表をマークします。このコマンドでは、Sybaseシステム・プロシージャsp_setreptableおよびsp_setrepcolを使用します。ADD TRANDATAは、データベース・インタフェースを介してこれらのプロシージャを使用するかわりに、表をマークするための推奨される方法ですが、所有者またはシステム管理者は、必要に応じてそれらの手順を使用できます。詳細は、Sybaseのドキュメントを参照してください。
ADD TRANDATAで表をレプリケーション対象としてマークするには:
マークする各表に対してADD TRANDATAコマンドを実行します。ADD TRANDATAコマンドの構文は次のとおりです。
ADD TRANDATA SCHEMA.TABLE LOBSNEVER | LOBSALWAYS | LOBSALWAYSNOINDEX | LOBSIFCHANGED
LOBSNEVER | LOBSALWAYS | LOBSALWAYSNOINDEX | LOBSIFCHANGEDは、LOBデータを伝播しないか、変更された場合のみ伝播する(デフォルト)、常に伝播するかどうかを制御します。LOBオプションが指定されていない場合は、LOBSIFCHANGEDがデフォルト値です。ADD TRANDATAコマンドは、表に対して現在設定されているLOBレプリケーション設定を上書きします。
ノート: ADD TRANDATAの一部のオプションによって、sp_setrepcolのALWAYS_REPLICATEオプションが有効になります。LOB列にNULL値が含まれていると、(LOBが更新されず)表内の別の列を更新された場合、ALWAYS_REPLICATEが有効になっていても、そのLOBはキャプチャされません。