2016-08-03 3 views
3

Oracleが意図していない方法でマテリアライズド・ビュー・ログを使用するソリューションを検討しています。 アイデアは、OracleソースおよびOracle以外のターゲットに対して高速リフレッシュMV機能を実装することです。 私はこの方法をテストして動作することを確認しましたが、この意図しないサポートされていない使用の長期的な結果が心配です。変更データ・キャプチャのMVログをハッキングする

MY_TABは、Oracle以外の別のRDBMSでミラー化するOracle(11.2)表です。

ターゲット表の参照は、ソース・データベースのOracleプロシージャによって起動される外部プロセスによって適用されます。 このプロセスは、MVログから抽出したデータセットを受け入れ、変更をターゲットに適用します。 処理が成功すると、処理された変更がMVログから削除されます。

MLOG $ _MY_TABとして作成されたMY_TABのためのMVログです:

CREATE MATERIALIZED VIEW LOG ON my_tab 
WITH PRIMARY KEY; 

注:このMVログに関連したMVはありません。 refereshプロセスは、以下の手順を呼び出すことによって呼び出される

BEGIN 

    SELECT * 
    FROM mlog$_my_tab; 

    /* Call externall process and pass the data */ 

    DELETE mlog$_my_tab; 

    COMMIT; 

END; 

を誰もが、一般的な意図しない/サポートされていない懸念する以外に、このアプローチには任意の特定の問題を、見ていますか?

+2

次の点に注意する必要があります。マテリアライズド・ビュー・ログの削除は、ログ内のデータ量に応じて時間がかかることがあります。ログを切り捨てるほうがよいでしょう。このプロセスを実行するときは、my_tabテーブルでトランザクションが発生していないことを確認する必要があります。ここでは、mviewログを切り捨てるトピックに関するいくつかのドキュメントを示します。 https://docs.oracle.com/cd/B28359_01/server.111/b28327/rarmanmv.htm#i30379 –

+0

ありがとう、phonetic_man。以前はこの文書を見ていませんでしたが、MVログからの削除は実際にはOracleのマニュアルでカバーされています。私にもっと自信を感じさせる。私はDELETEを正確に選択したので、ベーステーブルへの同時変更について心配する必要はありません。私はむしろ定期的なストレージのメンテナンスをしたいと思いますこの方法では、未処理のログを削除できないことに同意しますか? –

+0

私はここで一つの問題を予見します。私はあなたのトランザクションの分離レベルがコミットされた(これはデフォルトです)と仮定します。これは、 "トランザクションによって実行された各クエリは、トランザクションではなくクエリが開始される前にコミットされたデータのみを認識します"。ただし、ファントムの読み取りから保護されません。「トランザクションは、検索条件を満たす一連の行を戻す問合せを再実行し、別のコミット済トランザクションが条件を満たす行を追加挿入したことを検出します。 https://docs.oracle.com/cd/B13789_01/server.101/b10743/consist.htm。 ...下に続き... –

答えて

1

私の上記のコメントに基づいて、変更されたアプローチを提案したいと思います。新しいテーブルmv_log_replicaを作成します。このテーブルは、mv_logテーブルのレプリカである必要があります。

BEGIN 
    DELETE FROM mv_log_replica; 
    INSERT INTO mv_log_replica 
    (
    pk_col, 
    col1, 
    col2) 
    SELECT 
    pk_col, 
    col1, 
    col2 
    FROM mlog$_my_tab; 

    /* Call externall process and pass the data */ 
    /* Here instead of mlog$_my_tab use the mv_log_replica table */ 

    DELETE FROM mlog$_my_tab a 
    WHERE EXISTS (SELECT 1 FROM mv_log_replica b WHERE a.pk_col = b.pk_col); 

    COMMIT; 
END; 

この方法を使用すると、mv_log_replicaテーブルにコピーされたデータのみが確実に削除されます。追加のデータがmv_logの間に挿入されている場合、そのデータは削除されません。さらに、mv_log_replicaをグローバル一時表(ON COMMIT DELETE ROWS)にすることができます。

+0

はい。または、複数のソースからログを収集する永続的なテーブルにすることもできます。私がPKの代わりにROWIDに頼ることができるかどうか疑問に思う。しかし、私はその質問の新しいスレッドを開きます。 –

+0

別の方法があるかもしれません。 DEFAULT SYSTIMESTAMPを使用してログに列を追加できました。 –

+0

はい、タイムスタンプと一緒に行くと、より良い選択肢になります。 –

関連する問題