()高级复制(Advanced Replication)
首先,从总部业务系统的业务需求出发,业务系统只需要对只读的数据进行同步和查询。
Oracle高级复制,也成为对称复制,分为多主体复制、物化试图复制和前两种的混合复制(参考图1-1,图1-2)。高级复制主要是用在对称的、等同的数据库表之间的(单向或双向)的复制,以满足分布式应用的需求。但高级复制也有一些缺点:
1.对网络的稳定性和传输速度要求比较高。
2.配置和管理稍微麻烦。
图1-1Multimaster Replication
图1-2Read-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.在源表建立物化视图日志
--connect BISONcu
CREATE MATERIALIZED VIEW LOG ON MODEL
tablespace &BISONCU_SPACE           -- 日志空间
WITH PRIMARY KEY;        -- 指定为主键类型
2.授权给中间用户
--此处省略中间用户建立同义词的SQL语句
grant select on MODEL to aicentersupport;
grant select on MLOG$_MODEL to aicentersupport;
3.在目标数据库上创建DBLink
4.在目标数据库上创建MATERIALIZED VIEW
--connect BISONcs
CREATE MATERIALIZED VIEW AICS_MODEL
TABLESPACE &BISONCS_SPACE
REFRESH FAST                            
   ON DEMAND        
   --第一次刷新时间
   --START WITH to_date('2008-08-08 20:00:00', 'yyyy-mm-dd hh24:mi:ss')  
   START WITH sysdate    
   --刷新时间间隔。每1天刷新一次,时间为凌晨2点
   --NEXT TRUNC(SYSDATE,'dd')+1+2/24         
   NEXT sysdate+1/24/20
WITH PRIMARY KEY
--USING DEFAULT LOCAL ROLLBACK SEGMENT
DISABLE QUERY REWRITE AS
select model_id, status, model_name, manu_id, description, create_time, update_time, sw_version
from aics_model@link_aics;
 
5. 在目标物化视图上创建索引
 
--例如对DEV_INFO表,需要创建索引,主键索引已经默认创建
create index IDX_T_DV_CT on aics_DEV_INFO (CREATE_TIME, UPDATE_TIME) tablespace &BISON_IDX;
 create index IDX_T_DV_UT on aics_DEV_INFO (UPDATE_TIME) tablespace &BISON_IDX;
 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. DISABL 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. 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. --第一次刷新时间
  31. START WITH to_date('2008-08-08 20:00:00', 'yyyy-mm-dd hh24:mi:ss')
  32. START WITH sysdate
  33. 一天一次
  34. NEXT TRUNC(SYSDATE,'dd')+1+2/24
  35. 每两小时一次
  36. Next TRUNC(SYSDATE,'hh')+2/24
  37. WITH PRIMARY KEY
  38. DISABLE QUERY REWRITE AS
  39. Select item_id, model_param_id, attr_id, attr_name, tem_value, description, supported
  40. From AICS_static_info_child@BISONCS;
  41.  
  42.  
  43. CREATE MATERIALIZED VIEW AICS_DEV_INFO
  44. Partition by hash (IMEI)
  45. (
  46. Partition P1 tablespace &BISONCS_OTHER,
  47. Partition P2 tablespace &BISONCS_OTHER,
  48. Partition P3 tablespace &BISONCS_OTHER,
  49. Partition P4 tablespace &BISONCS_OTHER,
  50. Partition P5 tablespace &BISONCS_OTHER,
  51. Partition P6 tablespace &BISONCS_OTHER,
  52. Partition P7 tablespace &BISONCS_OTHER,
  53. Partition P8 tablespace &BISONCS_OTHER
  54. )
  55. REFRESH FAST
  56. ON DEMAND
  57. 第一次刷新时间 START WITH to_date('2008-08-08 20:00:00', 'yyyy-mm-dd hh24:mi:ss')
  58. START WITH sysdate
  59. NEXT TRUNC(SYSDATE,'dd')+1+2/24
  60. WITH PRIMARY KEY
  61. DISABLE QUERY REWRITE AS
  62. Select IMEI, MODEL_ID, MANU_ID, SW_VERSION, CREATE_TIME, UPDATE_TIME,MSISDN,IMSI,STATUS
  63. From AICS_DEV_INFO@BISONCS;
  64.  
  65. 3.在目标物化视图上创建其他索引 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;