最近在搞Oracle数据库物化视图的数据同步,通过查阅资料,找到两种不同的方式。
表设置:服务器A为主服务器,有一个表test,服务器B需要同步服务器A中的test表数据。服务器B中有个数据库链接LINK_A
方法一:
在服务器A上
CREATE MATERIALIZED VIEW LOG ON TEST;
在服务器B上
CREATE MATERIALIZED VIEW TEST REFRESH FAST ON DEMAND
START WITH TO_DATE('18-09-2008 00:00:00','dd-mm-yyyy hh24:mi:ss') NEXT SYSDATE+1 AS
SELECT * FROM TEST@LINK_A;
优点:代码较少,在服务器B上运行完上述SQL命令后,会自动在服务器B上建立TEST表,并从服务器A将TEST表中的数据完全复制到服务器B中,还自动建立一个JOB,并每隔指定时间用FAST方式同步数据。
缺点:在服务器B上的TEST表完全依赖于物化视图TEST,一旦将物化视图TEST删除,自动建立的JOB、TEST表以及TEST相关的索引、触发器等都会消失。
方法二:
在服务器A上
CREATE MATERIALIZED VIEW LOG ON TEST;
在服务器B上
CREATE TABLE TEST AS SELECT * FROM TEST@LINK_A WHERE 1=2;
CREATE MATERIALIZED VIEW TEST ON PREBUILT TABLE REFRESH FAST ON DEMAND
AS SELECT * FROM TEST@LINK_A;
DBMS_MVIEW.REFRESH(LIST=>'TEST',METHOD=>'COMPLETE');
SYS.DBMS_JOB.SUBMIT(JOB=>:JOB,WHAT=>'DBMS_MVIEW.REFRESH(LIST=>''TEST'',METHOD=>''FAST'');',
NEXT_DATE=>TO_DATE('18-09-2008 00:00:00','dd-mm-yyyy hh24:mi:ss'),
INTERVAL=>'SYSDATE+1');
优点:在服务器B上的TEST表不依赖于物化视图TEST,无论对物化视图做任务操作,都不会影响TEST表中的数据和相关触发器等设置。
缺点:代码较多,得手动建立TEST表结构,手动做一次完全复制,手动建立JOB。