数据同步

http://www.itpub.net/150607.html

http://yangtingkun.itpub.net/post/468/246820

http://cosio.itpub.net/post/10244/467235

1.通过物化视图方式同步两服务器中数据表的两种不同方式的比较

最近在搞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。

文章出处:DIY部落(http://www.diybl.com/course/7_databases/database_other/2008921/144194.html#)

 

 

2.怎么样使用物化视图来同步数据

 

mv可以用来同步数据,一般采用主键同步或者是ROWID同步,我们这里只讨论主键同步(Rowid同步其实是为Rowid在目标表上创建了一个隐含索引,原理跟主键同步一样)。mv的主要原理就是记录更改的日志,并同步到远程。 |/XjA4j  
一个简单的例子: *;,=x<  
1AjsAi,7;2  
o!aKeM~|Es  
代码:-------------------------------------------------------------------------------- =yz#L@/!  
create materialized view log on AUCTION_FEEDBACKS; x98LOO  
B(:Kw;r?  
create materialized view AUCTION_FEEDBACKS [on prebuilt table] refresh fast as XG<^j}H{}  
select * from AUCTION_FEEDBACKS@lnk_db1; h$f/NSct2  
_>dqz(8#  
exec dbms_mview.refresh('AUCTION_FEEDBACKS',method => 'Complete'); 5caYA&R  
exec dbms_mview.refresh('AUCTION_FEEDBACKS'); Wey-nsk  
W ;P1T"*A  
declare jobid number; @7u4v%,wB  
begin ,h #!!j/j6  
sys.dbms_job.submit(job => jobid, i>ORCOOU  
              what => 'dbms_mview.refresh(''AUCTION_FEEDBACKS'');', cuq7eMG6z  
              next_date => sysdate, g" (N_sv?  
              interval => 'sysdate+5/1440'); #xW%RF  
commit; ^nbze  
end; yC+N18y?  
/ ;cp-jY_U  
.-------------------------------------------------------------------------------- S~(4q#Dt-  
II>X6  
其中,第1步是在主表上创建mv log, RVI],O  
第2步是在远程站点上创建mv,注意,如果选择了选项on prebuild table的话,远程必须存在与主站点结构一样的表,但可以没有数据。 ngeX+@  
第3步是全同步,如果没有选择on prebuild table,这一步可以省略, LTzf&TZbx5  
第4步是增量刷新,在以后的情况下,一般都只需要做增量刷新即可, &CUkR6  
第5步是创建一个自动刷新的作业来进行刷新,如每5分钟刷新一次,这个操作也可以同crontab来代替。 x-tA {_:  
elKQge  
dba_mviews记录了远程站点上mv的数目与属性,需要在创建MV的远程站点上查询。 &cpRB&bf  
sys.mlog$则记录了主站点上的mv的log数目,如果一个master对应到多个站点,也只有一条记录,对应到dba_mview_logs视图,需要在主站点查询。 5Qy,P kje  
sys.slog$记录了主站点上已经注册成功的主表信息,如果一个主表被复制到多个站点,则对应多条记录,在主站点查询。 cgz'6q'T  
dba_snapshot_logs存放了mv的log日志,如果对应到多个站点,则每个站点都对应一条记录,因为远程站点的snapshot_id是不一样的。其实sys.mlog$与sys.slog$的关联就是组成dba_snapshot_logs的一个部分,通过查询dba_views可以看到其脚本。 _^P>@ ^  
!Id F6 %  
dba_registered_snapshots记录了远程站点的注册信息,只记录注册成功的远程站点,通过snapshot_id可以与dba_snapshot_logs关联。如 p%3';7W/  
.zegG=q  
代码:-------------------------------------------------------------------------------- 3_33@MM  
SQL>select t.log_owner,t.master,t.log_table,t.current_snapshots, BwEL/*$g  
r.owner,r.name,r.snapshot_site OcSLRN?t  
from dba_snapshot_logs t,dba_registered_snapshots r ZT^PL3j+  
where t.snapshot_id= r.snapshot_id(+) -C8awtbC  
.-------------------------------------------------------------------------------- ?^"S%Vb  
=%]dk=n?TN  
删除mv的时候,需要先删除mv,再删除mv日志 F[?t"d  
远程站点:drop materialized view AUCTION_FEEDBACKS; 0e}L Z,9e  
主站点:drop materialized view log on AUCTION_FEEDBACKS; 90ORx/Oeo  
(TY^ kySr  
注意,删除mv的时候,如果主站点需要分发到多个远程站点,只有当所有远程站点的MV删除完成后,才可以删除MV日志。 =E,*8O]  
删除远程站点的MV的时候,要保证与主站点的通信顺畅,如果网络不通,则主站点无法正常Unregister MV,而主站点的mv log又因为其它站点而不删除,将可能引起主站点mlog表的膨胀(因为它不知道这个mv的删除,需要等待这个站点的刷新)。这个时候,可以手工强行解除注册。 3ea6g5kX  
exec DBMS_SNAPSHOT.PURGE_SNAPSHOT_FROM_LOG (snapshot_id); P"xP%zqo  
s/ ~r 8  
如果mlog因为日志曾经很多而变得很大的时候,对mlog的操作如日志删除将变得很慢,因为mlog上没有任何索引,走的都是全表扫描,这个时候,我们可以move该日志表或者是等日志表没有记录的时候truncate该表。 ^c!Hur6)  
alter table mlog$_auction_feedbacks move; 7%?A0%>6G  
Z&21gN  
如果要对有mv复制的表增加字段,最好在停机情况下进行,因为这样不会产生mv log,而且最好采用prebuild模式,因为这种模式下,删除mv的定义将保留表(也就是不删除表与相关数据)。相关步骤: W{0<ro`  
停机模式下: YxsW Y7J  
/Mi y+<8$  
代码:-------------------------------------------------------------------------------- /5O4}sm$*  
1、远程站点:drop materialized view MV_TABLE; ` NcWy  
2、主站点:alter table master_table add new_field number; ]3C7guWz  
3、远程站点:alter table mv_table add new_field number; *R8q)Q  
4、远程站点:create materialized view mv_table on prebuilt table !7Ta Vx}`(  
  refresh fast as KLlW/MF1  
    select * from master_table@lnk_db; s8eFEi  
YW0UIO  
.-------------------------------------------------------------------------------- [,$] %|6wt  
T/uj5pMG  
为什么要停机操作,是因为创建快速刷新的mv的时候,将删除主站点上创建mv时间点之前的相关log,所以在删除mv与重新创建mv之前,不能对主表有任何dml产生新的日志,否则将可能引发数据的不一致。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
greenplum是一款高性能、可扩展的开源分布式数据库管理系统,用于处理大数据量的存储和分析。在数据处理场景中,数据同步是一个关键的问题。 Greenplum中数据同步有多种方式,我们可以根据实际需求选择合适的方法。一种常见的数据同步方式是使用ETL工具,如Informatica、Talend等,通过配置数据源和目标,将数据从源系统提取、转换和加载到Greenplum中。这种方式可以根据需求定时或实时同步数据。 除了ETL工具,还可以使用数据库复制技术来实现数据同步。Greenplum支持异步复制和同步复制两种方式。异步复制通过将数据变更记录发送给备份节点,减少了主节点的负载,但有一定的延迟。同步复制则要求主节点等待备份节点确认数据变更,确保数据的一致性和可靠性,但会增加主节点的负载。 此外,还可以使用消息队列来实现数据的异步同步。消息队列作为中介,将源系统中的数据发送到队列中,再由消费者将数据加载到Greenplum中。这种方式可以实现高可用性和容错性。 另外,也可以通过编写自定义的脚本或程序来实现数据同步。例如,可以使用Python或Java编写脚本,通过API连接到Greenplum和源系统,实现数据的抽取和加载。 总之,根据具体需求和场景,可以选择合适的数据同步方式。无论是使用ETL工具、数据库复制、消息队列还是自定义脚本,都能够满足数据同步的需求,确保数据的准确性和及时性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值