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;
を誰もが、一般的な意図しない/サポートされていない懸念する以外に、このアプローチには任意の特定の問題を、見ていますか?
次の点に注意する必要があります。マテリアライズド・ビュー・ログの削除は、ログ内のデータ量に応じて時間がかかることがあります。ログを切り捨てるほうがよいでしょう。このプロセスを実行するときは、my_tabテーブルでトランザクションが発生していないことを確認する必要があります。ここでは、mviewログを切り捨てるトピックに関するいくつかのドキュメントを示します。 https://docs.oracle.com/cd/B28359_01/server.111/b28327/rarmanmv.htm#i30379 –
ありがとう、phonetic_man。以前はこの文書を見ていませんでしたが、MVログからの削除は実際にはOracleのマニュアルでカバーされています。私にもっと自信を感じさせる。私はDELETEを正確に選択したので、ベーステーブルへの同時変更について心配する必要はありません。私はむしろ定期的なストレージのメンテナンスをしたいと思いますこの方法では、未処理のログを削除できないことに同意しますか? –
私はここで一つの問題を予見します。私はあなたのトランザクションの分離レベルがコミットされた(これはデフォルトです)と仮定します。これは、 "トランザクションによって実行された各クエリは、トランザクションではなくクエリが開始される前にコミットされたデータのみを認識します"。ただし、ファントムの読み取りから保護されません。「トランザクションは、検索条件を満たす一連の行を戻す問合せを再実行し、別のコミット済トランザクションが条件を満たす行を追加挿入したことを検出します。 https://docs.oracle.com/cd/B13789_01/server.101/b10743/consist.htm。 ...下に続き... –