4

移行前にテーブルの同期を保つために、事前構築済みテーブルでマテリアライズド ビューを使用したいと考えています。データは常に変化しているため、エクスポート開始からインポート終了までの変化を追跡する必要があります。言うまでもなく、テーブルは巨大であるため、完全な更新は遅すぎます。

実行したい手順:

  1. 新しいデータベースにテーブルを作成します。
  2. 古いデータベース テーブルに mv ログを作成します。
  3. 古いデータベースから新しいデータベースにデータをインポートします。
  4. prebuild テーブルの新しいデータベースにマテリアライズド ビューを作成し、mv ログが作成された時点から更新し続けます。

問題は、マテリアライズド ビューが作成された瞬間に、古いテーブルの mv ログが削除されることです。

古い DB: テーブル kvrtest (id 番号、cat 番号) を作成します。

alter table kvrtest add ( constraint pkkvrtest primary key (id) using index);

insert into kvrtest (id, cat) values (1, 1);
commit;

CREATE MATERIALIZED VIEW LOG ON kvrtest WITH PRIMARY KEY;

insert into kvrtest (id, cat) values (2, 1);
insert into kvrtest (id, cat) values (3, 2);
commit;

select * from MLOG$_KVRTEST; --Yields 2, these should be caught by a fast refresh.

新しい DB: テーブル kvrtest (id 番号、cat 番号) を作成します。

alter table kvrtest add ( constraint pkkvrtest primary key (id) using index);

insert into kvrtest (id, cat) values (1, 1); --Simulate import.

commit;

CREATE MATERIALIZED VIEW kvrtest 
ON PREBUILT TABLE WITHOUT REDUCED PRECISION
USING INDEX
REFRESH FORCE ON DEMAND
AS 
select * from kvrtest@oldDb;

この時点で、mv ログはパージされます

select * from MLOG$_KVRTEST; --Yields 0, a fast refresh from here does not catch these records.

助言がありますか?

4

1 に答える 1

4

REFRESH タグを使用して新しい MATERIALIZED VIEW を作成すると、ログ テーブルがクリアされます。これは、ビューが実際に作成された後であるためです。

CREATE MATERIALIZED VIEW kvrtest 
ON PREBUILT TABLE WITHOUT REDUCED PRECISION
USING INDEX
REFRESH FORCE ON DEMAND
AS 

ログテーブルをクリアしたくない場合は、NEVER REFRESH を使用してから、次のように REFRESH ON DEMAND に変更します。

CREATE MATERIALIZED VIEW kvrtest 
ON PREBUILT TABLE WITHOUT REDUCED PRECISION
USING INDEX
NEVER REFRESH
AS 
select * from kvrtest@oldDb;

ログテーブルを見てみましょう

select * from MLOG$_KVRTEST;

2 つの行があります。その後

ALTER MATERIALIZED VIEW kvrtest 
    REFRESH ON DEMAND;

その後、ビュー ログ テーブルを更新すると、再びクリアされます。

于 2012-11-29T07:02:03.923 に答える