oracle – 创建新的物化视图,而不清除物化视图日志

前端之家收集整理的这篇文章主要介绍了oracle – 创建新的物化视图,而不清除物化视图日志前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想在预建表上使用物化视图,以便在迁移之前保持表同步.数据不断变化,因此需要跟踪导出开始和导入完成之间的变化.不言而喻,桌子很大,所以完全刷新太慢了.

步骤id喜欢执行:

>在新数据库上创建表.
>在旧的db表上创建mv日志.
>将旧数据库中的数据导入新数据库.
>在prebuild表上的新数据库上创建物化视图,并从创建mv日志时的点开始刷新它.

问题是,在创建实体化视图的那一刻,将清除旧表上的mv日志.

老DB:
    create table kvrtest(id number,cat number);

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.

数据库
    create table kvrtest(id number,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.

有什么建议?

解决方法

当您使用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;

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

猜你在找的Oracle相关文章