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了,而且也没上面那么多事.
听起来不错,但不知实际速度如何,若速度太慢,则还是不可取。 只是这是产品库,我没有机会再试验这个方法了。