処理のための表の準備

次の表属性は、Oracle GoldenGate環境で処理する必要があります。

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

ターゲットSybase表のトリガー、カスケード削除制約、カスケード更新制約を無効にするか、Oracle GoldenGateデータベース・ユーザーによる変更を無視するように変更します。Oracle GoldenGateでは、トリガーまたはカスケード制約の結果として生成されるDMLがレプリケートされます。同じトリガーや制約がターゲット表でアクティブになった場合、レプリケートされたバージョンのために重複となり、データベースでエラーが返されます。ソース表にemp_srcsalary_src、ターゲット表にemp_targsalary_targを使用している次の例について考えます。

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

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

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

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

  5. 親削除によって、削除がsalary_targにカスケードされます。

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

  7. 行は、すでにステップ5で削除されているため、見つかりません。

データベース・セッションの開始時にターゲット・トリガーを無効化するようにReplicatを構成するには、次のステップを実行します。

  1. Replicatユーザーにレプリケーション・ロールを割り当てます。
  2. Replicatパラメータ・ファイルのルート・レベルに、次のパラメータ文を追加します。
    SQLEXEC "set triggers off"
    

行識別子の割当て

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

キーのない表での行の変更の制限

ターゲット表に主キーまたは一意のキーがない場合は、重複する行が存在する可能性があります。Oracle GoldenGateで更新または削除されるターゲット表の行数が多くなりすぎ、ソース・データとターゲット・データの同期がとれなくなる可能性があります。警告するエラー・メッセージは表示されません。更新される行数を制限するには、Replicatパラメータ・ファイルでDBOPTIONSパラメータにLIMITROWSオプションを使用します。LIMITROWSを使用すると1行しか処理されないため、ターゲット・システムにおけるOracle GoldenGateのパフォーマンスが向上する可能性があります。

暗号化されたデータのレプリケーション

Oracle GoldenGateは、システム暗号化パスワードで暗号化された列をサポートしていますが、ユーザー定義パスワードで暗号化された列はサポートしていません。Oracle GoldenGateの次の制限事項について、データの取得元となる表を確認します。

  • 暗号化された列を含む表には、主キーまたは一意のキーが必要です。

  • 暗号化を使用する列は、主キーの一部にはできません。

暗号化された列は、データ・ファイルおよびログで暗号化されるため、データベースからクリアテキスト値をフェッチするようにExtractを構成する必要があります。このフェッチをトリガーするには、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 )

デフォルトでは、設定された2次切捨てポイントはExtractで管理されます。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_setrepcolALWAYS_REPLICATEオプションが有効になります。LOB列にNULL値が含まれていて、表内の別の列が更新された(LOBは更新されない)場合、ALWAYS_REPLICATEが有効になっていても、このLOBは取得されません。