4

我想在预建表上使用物化视图在迁移之前保持表同步。数据不断变化,因此需要跟踪导出开始和导入结束之间的变化。不用说表很大,所以完全刷新太慢了。

步骤 id 喜欢执行:

  1. 在新数据库上创建表。
  2. 在旧数据库表上创建 mv 日志。
  3. 将旧数据库中的数据导入新数据库。
  4. 在预构建表上的新数据库上创建物化视图,并从创建 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;

我们有两排,很好!进而

ALTER MATERIALIZED VIEW kvrtest 
    REFRESH ON DEMAND;

然后刷新视图日志表后将再次清除。

于 2012-11-29T07:02:03.923 回答