高级复制与物化视图的选型

一、      同步技术的选型

 

(一)             高级复制(Advanced Replication)

首先,从总部业务系统的业务需求出发,业务系统只需要对只读的数据进行同步和查询。

 

Oracle高级复制,也成为对称复制,分为多主体复制、物化试图复制和前两种的混合复制(参考图1-1,图1-2)。高级复制主要是用在对称的、等同的数据库表之间的(单向或双向)的复制,以满足分布式应用的需求。但高级复制也有一些缺点:

1.         对网络的稳定性和传输速度要求比较高。

2.         配置和管理稍微麻烦。

 


图1-1     Multimaster Replication

 


 

 

图1-2     Read-Only Materialized View Replication

 

下面是高级复制中的 物化视图架构的创建步骤:

1、检查系统初始化参数

       global_names 为 TRUE 以及job_queue_processes大于0。

2、检查全局数据库名称

       上述三个站点的db_domain名称应该相同,只有db_name不同。

3、修改上述三个站点中的tnsnames.ora文件

4、建立主体站点

       建立复制管理用户repadmin;建立主体组和实体化视图组;

       注册传播用户;

       建立物化视图站点复制管理用户的代理用户;

 

5、设置物化视图站点1

       建立物化视图管理用户mvadmin;

       注册传播用户;

 

6、设置物化视图站点2

       建立物化视图管理用户mvadmin;

       注册传播用户;

 

7、建立主体组

       创建复制组,并将复制对象添加到复制组;

       生成复制支持;

 

8、建立物化视图日志

       建立物化视图日志(主站点);

       建立物化视图;

       将物化视图和相关索引添加到物化视图组;

       将物化视图添加到刷新组;

 

对于高级复制中的多主环境和可更新的物化视图环境而言,它的原理是使用Oracle的Internal Trigger捕获DML及DDL操作,并将这些操作封装在Remote Procedure Calls(RPCs)里,并借助Deferred Transaction Queue来传递RPCs并在目标数据库利用Internal Trigger执行传递过来的RPCs从而实现了数据的同步。

如果仅仅是高级复制环境中的只读物化视图环境,那么Oracle这里并不会使用Deferred Transaction Queue来传递RPCs,而是直接利用解析物化视图日志的方式来实现数据的同步。

 

(二)             物化视图(MATERIALIZED VIEW)

 

1.         物化视图的种类:

物化视图,根据不同的着重点可以有不同的分类

1)        按刷新方式分:FAST/COMPLETE/FORCE

2)        按刷新时间的不同:ON DEMAND/ON COMMIT

3)        按是否可更新:UPDATABLE/READ ONLY

4)        按是否支持查询重写:ENABLE QUERY REWRITE/DISABLE QUERY REWRITE

 

物化视图有三种刷新方式:COMPLETE、FAST和FORCE。

 

1)        完全刷新(COMPLETE)会删除表中所有的记录(如果是单表刷新,可能会采用TRUNCATE的方式),然后根据物化视图中查询语句的定义重新生成物化视图。

2)        快速刷新(FAST)采用增量刷新的机制,只将自上次刷新以后对基表进行的所有操作刷新到物化视图中去。

3)        采用FORCE方式,Oracle会自动判断是否满足快速刷新的条件,如果满足则进行快速刷新,否则进行完全刷新。

 

设置REFRESH ON COMMIT的物化视图不能访问远端对象。

Oracle物化视图的快速刷新机制是通过物化视图日志完成的。Oracle如何通过一个物化视图日志还可以支持多个物化视图的快速刷新。

 

还可以使用以下语句进行手动刷新:

exec DBMS_MVIEW.REFRESH('aics_t_dv');

 

1、完全刷新

exec dbms_mview.refresh(list => 'aics_t_dv',method => 'c');

 

2、快速刷新

exec dbms_mview.refresh(list => 'aics_t_dv',method => 'f');

 

2.         对物化视图日志的讨论:

物化视图日志表的大小跟日志表的临时存储的数据量有关。比如DEV_INFO表每天增量更新大概为300万条记录。那MLOG$日志表的大小也大概为300M左右。而另外一个日志表RUPD$只是临时表,不会耗用空间。

 

(三)             流复制(Streams Replication)

 

Streams Replication是Oracle 10g新推出的同步技术。Streams Replication基于日志挖掘原理(数据库必须运行在Archive Log模式),可以实现表,用户,数据库级别的同步。

Streams Replication在实时性、稳定性、高效率、低消耗(较少的cpu/network资源)等方面更有优势,但凡一些新推出的功能,都或多或少存在一些不确定的因素。Stream对系统的设计与维护方要有相当的对stream技术的把控能力,而大多数系分与DBA对这个东西都没有经验,所以难以推广。

 

(四)             总结

 

从我们的需求出发,我们只需要通过数据库链,建立基于主键的快速刷新的物化视图就可以满足需求,而且易于配置和管理。

 

二、      创建物化视图的步骤

创建快速刷新的物化视图的步骤和参考脚本如下所示:

Sql代码   收藏代码
  1. 1.  在源表建立物化视图日志  
  2. --connect BISONcu  
  3. CREATE MATERIALIZED VIEW LOG ON MODEL   
  4. tablespace &BISONCU_SPACE           -- 日志空间  
  5. WITH PRIMARY KEY;           -- 指定为主键类型  
  6. 2.  授权给中间用户  
  7. --此处省略中间用户建立同义词的SQL语句  
  8. grant select on MODEL to aicentersupport;  
  9. grant select on MLOG$_MODEL to aicentersupport;  
  10. 3.  在目标数据库上创建DBLink  
  11. 4.  在目标数据库上创建MATERIALIZED VIEW  
  12. --connect BISONcs  
  13. CREATE MATERIALIZED VIEW AICS_MODEL  
  14. TABLESPACE &BISONCS_SPACE  
  15. REFRESH FAST                               
  16.    ON DEMAND           
  17.    --第一次刷新时间  
  18.    --START WITH to_date('2008-08-08 20:00:00', 'yyyy-mm-dd hh24:mi:ss')     
  19.    START WITH sysdate       
  20.    --刷新时间间隔。每1天刷新一次,时间为凌晨2点  
  21.    --NEXT TRUNC(SYSDATE,'dd')+1+2/24            
  22.    NEXT sysdate+1/24/20  
  23. WITH PRIMARY KEY  
  24. --USING DEFAULT LOCAL ROLLBACK SEGMENT  
  25. DISABLE QUERY REWRITE AS  
  26. select model_id, status, model_name, manu_id, description, create_time, update_time, sw_version  
  27. from aics_model@link_aics;  
  28.   
  29. 5.  在目标物化视图上创建索引  
  30.   
  31. --例如对DEV_INFO表,需要创建索引,主键索引已经默认创建  
  32. create index IDX_T_DV_CT on aics_DEV_INFO  (CREATE_TIME, UPDATE_TIME) tablespace &BISON_IDX;  
  33.   create index IDX_T_DV_UT on aics_DEV_INFO  (UPDATE_TIME) tablespace &BISON_IDX;  
  34.   create index I_T_DV_MSISDN on aics_DEV_INFO  (MSISDN) tablespace &BISON_IDX;  
 

 

三、      常见问题

考虑因素:

1)        数据复制的实时性;

虽然不能实现立即更新的实时性,但系统需求只要求在每天凌晨3点能够读取更新完成的数据。

所以只要设置ON DEMAND方式,并每天一次或多次进行增量刷新。

 

2)        数据复制对系统性能的影响;

测试的性能指标数据——

 

数据量

耗时

磁盘I/O

备注

创建物化视图

100w数据

11 secs

 

不包括创建索引的时间。

14000w数据

2175 secs

 

大概半小时

刷新视图

100w数据的刷新

980.875 secs

 

在其基础上刷新100w

14000w数据的刷新

10030secs(近3个小时)

 

在其基础上刷新100w

物化视图日志

新增100w数据

N/A

N/A

 

 

 

3)        数据复制实现方案配置维护的复杂程度:

对于快速刷新的物化视图的配置和维护:
源数据库只需要建立 物化视图日志,开放源表和物化视图日志的读权限。

目标数据库只需要建立快速刷新的物化视图,并创建相关的索引。

 

4)        创建物化视图的查询语句和分区:

总部外部服务接口模块在创建物化视图时,只需要引用表的部分字段,而且可以对物化视图进行分区。例如对AICS_DEV_INFO表,创建其物化视图的语句如下:

Sql代码   收藏代码
  1. CREATE MATERIALIZED VIEW AICS_DEV_INFO  
  2. partition by hash (IMEI)  
  3. (  
  4.   partition P1 tablespace &BISON_OTHER,  
  5.   partition P2 tablespace &BISON_OTHER,  
  6.   partition P3 tablespace &BISON_OTHER,  
  7.   partition P4 tablespace &BISON_OTHER,  
  8.   partition P5 tablespace &BISON_OTHER,  
  9.   partition P6 tablespace &BISON_OTHER,  
  10.   partition P7 tablespace &BISON_OTHER,  
  11.   partition P8 tablespace &BISON_OTHER  
  12. )  
  13. REFRESH FAST                               
  14.    ON DEMAND           
  15.    --第一次刷新时间  
  16.    START WITH to_date('2008-08-08 20:00:00''yyyy-mm-dd hh24:mi:ss')         
  17.    --刷新时间间隔。每1天刷新一次,时间为凌晨2点  
  18.    NEXT TRUNC(SYSDATE,'dd')+1+2/24   
  19. WITH PRIMARY KEY  
  20. DISABLE QUERY REWRITE AS  
  21. select MSISDN,IMSI,IMEI,MANU_ID,MODEL_ID,UPDATE_TIME from AICS_DEV_INFO@link_aics;  
 

5)        其他维护工作:

 

¨         物化视图日志表不能删除,如果删除则目标服务器的物化视图必须重建。

 

¨         物化视图不支持DDL的变更同步。但如果建立物化视图时,没有引用到源表的部分字段,则这些字段是可以更改的。

 

¨         查看目标物化视图的刷新情况。

select * from user_mviews;

select * from user_jobs;

select * from dba_jobs_running;

 

¨         查看物化视图所在的基表最后被成功刷新的时间:

SELECT MASTER,LOG_TABLE,CURRENT_SNAPSHOTS FROM DBA_SNAPSHOT_LOGS;

 

四、      参考脚本

 

下面是创建static_info_child、dev_info两个表的物化视图的参考脚本:

 

Sql代码   收藏代码
  1. <em>-- 1.在源表的数据库上,创建物化视图日志,指定为主键类型  
  2. conn xxx/xxx  
  3.   
  4. define BISON_OTHER=BISON_OTHER  
  5.   
  6. CREATE MATERIALIZED VIEW LOG ON static_info_child   
  7. tablespace &BISON_OTHER             
  8. WITH PRIMARY KEY;        
  9.   
  10. CREATE MATERIALIZED VIEW LOG ON dev_info   
  11. tablespace &BISON_OTHER             
  12. WITH PRIMARY KEY;        
  13.   
  14. grant select on MLOG$_static_info_child to aicentersupport;  
  15. grant select on MLOG$_dev_info to aicentersupport;  
  16.   
  17.   
  18. -- 2. 在目标表数据库上,创建物化视图,指定为主键类型和快速刷新  
  19. conn BISONcs/BISONcs  
  20.   
  21. define BISONCS=BISONCS  
  22. define BISONCS_OTHER=BISONCS  
  23. define BISONCS_IDX=BISONCS_IDX  
  24.   
  25. --set timing on;  
  26. CREATE MATERIALIZED VIEW AICS_static_info_child   
  27. TABLESPACE &BISONCS  
  28. REFRESH FAST                               
  29.    ON DEMAND           
  30.    --第一次刷新时间 START WITH to_date('2008-08-08 20:00:00', 'yyyy-mm-dd hh24:mi:ss')     
  31.    START WITH sysdate             
  32.   -- 一天一次  
  33.    NEXT TRUNC(SYSDATE,'dd')+1+2/24   
  34.   -- 每两小时一次  
  35.   -- next TRUNC(SYSDATE,'hh')+2/24  
  36. WITH PRIMARY KEY  
  37. DISABLE QUERY REWRITE AS  
  38. select item_id, model_param_id, attr_id, attr_name, item_value, description, supported  
  39. from AICS_static_info_child@BISONCS;  
  40.   
  41.   
  42. CREATE MATERIALIZED VIEW AICS_DEV_INFO  
  43. partition by hash (IMEI)  
  44. (  
  45.   partition P1 tablespace &BISONCS_OTHER,  
  46.   partition P2 tablespace &BISONCS_OTHER,  
  47.   partition P3 tablespace &BISONCS_OTHER,  
  48.   partition P4 tablespace &BISONCS_OTHER,  
  49.   partition P5 tablespace &BISONCS_OTHER,  
  50.   partition P6 tablespace &BISONCS_OTHER,  
  51.   partition P7 tablespace &BISONCS_OTHER,  
  52.   partition P8 tablespace &BISONCS_OTHER  
  53. )  
  54. REFRESH FAST                               
  55.    ON DEMAND           
  56.    --第一次刷新时间 START WITH to_date('2008-08-08 20:00:00', 'yyyy-mm-dd hh24:mi:ss')     
  57.    START WITH sysdate             
  58.    NEXT TRUNC(SYSDATE,'dd')+1+2/24   
  59. WITH PRIMARY KEY  
  60. DISABLE QUERY REWRITE AS  
  61. select IMEI, MODEL_ID, MANU_ID, SW_VERSION, CREATE_TIME, UPDATE_TIME,MSISDN,IMSI,STATUS  
  62. from AICS_DEV_INFO@BISONCS;  
  63.   
  64. -- 3. 在目标物化视图上创建其他索引  
  65. create index IDX_aics_DEV_INFO_UT on aics_DEV_INFO  (UPDATE_TIME) tablespace &BISONCS_IDX nologging;  
  66. create index I_aics_DEV_INFO_MSISDN on aics_DEV_INFO  (MSISDN) tablespace &BISONCS_IDX nologging;  
  67. </em>  
原文链接:http://csbison.iteye.com/blog/511939
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值