物化视图

1.建立dblink

create database link orcllink1 connect to user identified by passwd using 'ORCL';

 drop database link orcllink1;

2.在master database 建立materialized view log(fash refresh)

create materialized view log on t;

SELECT * FROM RUPD$_T;
SELECT * FROM MLOG$_T;

3.在materialized view database 建立物化视图
 create materialized view t_view refresh fast as select * fromt@orcllink;

4.手动刷新物化视图
exec dbms_mview.refresh('t_view');
 ---drop materialized view t_view;
---drop materialized view log on t;

5.建立group
exec dbms_refresh.make('refreshT_group','T_VIEW',SYSDATE,'SYSDATE+1/24');
刷新group EXEC DBMS_refresh.refresh('refreshT_group');

 

procedure和scheduler来刷新

create or replace procedure mv_refresh is
begin
 DBMS_refresh.refresh('refreshT_group');
end mv_refresh;

Begin
dbms_scheduler.create_job(
job_name => 'MV_REFRESH_JOB',
job_type => 'STORED_PROCEDURE',
job_action =>'LINYU.MV_REFRESH',
repeat_interval =>'FREQ=DAILY;BYHOUR=14;BYMINUTE=50;BYSECOND=0',
enabled => TRUE
); 
END;


select * from user_objects

begin
dbms_scheduler.drop_job(
job_name => 'MV_REFRESH_JOB');
end;

 

 

ORACLE9205 NCV31, ORACLE10202 NCBI. 数据从9205 刷新到 10202。
2月14号那天,在NCBI数据库的服务器上,想测试EXPDP导出来的DMP文件导回数据库后,能否自动刷新,
并且和源数据(31) 里的数据一致(不丢失插入,删除,修改). 把DMP文件导回到了NCBI数据库中的
REFRESH用户后,没想到却出现 ORA-12034 错误.

ORA-12048: error encountered while refreshing materialized view "ORA-12048: error encountered while refreshing materialized view "NCBI"."IC_GENERAL_H"
ORA-12034: materialized view log on "NCV31"."IC_GENERAL_H" younger than last refresh

结果是,3个刷新组都出现这种情况, 看着手机不断地接收到刷新组刷新时报错信息, 没辙, 只有重新
创建了物化视图.


 

第1次只重新创建物化视图,步骤:
1、把要重建的物化视图从刷新组中剥离出来.

exec dbms_refresh.subtract('TYREPORT','SO_SALEORDER_B').
2、删除物化视图。

drop materialized view SO_SALEORDER_B;
3、重新创建基于表上的物化视图.

CREATE MATERIALIZED VIEW "NCBI"."SO_SALEORDER_B" ON PREBUILT TABLE REFRESH FAST ON DEMAND AS SELECT * FROMSO_SALEORDER_B@NCDB;
4、把新建的物化视图加入到刷新组中去.

BEGIN
DBMS_REFRESH.ADD(
name => '"NCBI"."TYREPORT"',
list => '"NCBI"."SO_SALEORDER_B"',
lax => TRUE);
END;

但此方法将丢失,从刷新组出现 ORA-12034 错误开始,到重新创建物化视图后的这段时间内数据的
变化,因为重新创建物化视图时,其并不重新创建表,也不完全刷新表,这样,源和目标对应的表的数据
就不一致。此方法不可取。

第2个方法,重新建表,再建物化视图。步骤:

1、停止掉刷新组的作业,如:

exec dbms_scheduler.disable('J_TYBIDATA');

2、删除刷新组,如:

EXEC DBMS_REFRESH.DESTROY('TYBIDATA');
3、删除物化视图,如:

drop materialized view IC_ONHANDNUM;
4、删除基表,如:

drop table IC_ONHANDNUM purge;
5、重新创建物化视图,此次不再基于表上建.

create materialized view IC_ONHANDNUM tablespace NNC_DATA02 REFRESH FAST ON DEMAND AS SELECT * FROMIC_ONHANDNUM@NCDB;
6、重新创建物化视图的刷新组.

BEGIN
DBMS_REFRESH.MAKE(
name => '"NCBI"."TYBIDATA"',
list => '',
next_date => SYSDATE,
interval => '/*10:Mins*/ sysdate + 10/(60*24)',
implicit_destroy => FALSE,
lax => FALSE,
job => 0,
rollback_seg => NULL,
push_deferred_rpc => FALSE,
refresh_after_errors => TRUE,
purge_option => NULL,
parallelism => NULL,
heap_size => NULL);
END;

7、由于步骤6将创建一个JOB,而我们使用的是scheduler, 因此,需要把此JOB 给停止掉,

exec dbms_job.broken(,true);
commit;

8、把物化视图加入到刷新组。
BEGIN DBMS_REFRESH.ADD(name =>'TYBIDATA',list =>'IC_ONHANDNUM',lax => TRUE); END;

9、启动物化视图刷新组.

exec dbms_scheduler.enable('J_TYBIDATA');
10、对物化视图加索引。

但实际上这样操作起来很啰嗦, 同事询问,把物化视图所基于的表上的索引给UNUSABLE掉,然后来个
完全刷新,两边的数据应该就保持一致了,之后再把索引REBUILD. 这样应该就OK了,而且也没上面那么多事.
听起来不错,但不知实际速度如何,若速度太慢,则还是不可取。 只是这是产品库,我没有机会再试验这个方法了。


转载请标明出处:http://space.itpub.net/7301064/viewspace-509501

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值