使用其他的服务器,以避免某些站点负载过重。
物化视图还提供了按子集进行复制,这样各站点就可只复制自己需要的数据,也能减轻网络的传输量。
数据复制的实现方法
在具体的实现之前,首先要做好设计与规划。这就需要细致分析具体的业务情况,设计出一套能够满足业务需要的方案。通常在设计过程中,需要确定出要建立的数据库站点,各站点的类型,需要复制的数据对象,以及同步方式、冲突解决方案等内容。
在设计完成之后,就可具体来实现数据复制,实现主要包括以下几步:
(1)创建复制站点
(2)创建组对象
(3)配置冲突解决方案
下面我们举一个例子来说明各步具体需要完成的工作。在这个例子中我们采用多主控站点复制方式,设有两个主控站点和两个共享数据表。两个主控站点分别为:处理站点(cl.world)和解释站点(js.wo rld);两个数据表为测区( survey)和测线( line)。
step1 创建复制站点
(1)首先以system身份登陆主站点数据库cl.worldconnect system/[email protected]
(2)创建用户—复制管理员,并为该用户授权复制管理员负责复制站点的创建和管理,每个复制站点都必须创建复制管理员:
create user repadmin identified by repadmin;
begin
dbms_repcat_admin.grant_admin_any_schema (username => ’repadmin’);
end;
(3)为本站点指定传播者
传播者负责将本地最新更新的数据传播到其他站点上:
begin
dbms_defer_sys.register_propagator (username => ’repadmin’);
end;
(4)为本站点指定接收者
接收者负责接收其他站点上的传播者传送过来的数据:
begin
dbms_repcat_admin.register_user_repgroup (
username => ’repadmin’,
privilege_type => ’receiver’,
list_of_gnames => null);
end;
(5)确定清除时间
为了使传送过来事务队列不致过大,需要将成功加载的事务从事物队列里清除掉,这里设定每小时清除一次。
connect repadmin/[email protected]
begin
dbms_defer_sys.schedule_purge (
next_date => sysdate,
interval => ’sysdate + 1/24’,
delay_seconds => 0);
end;
在建立好站点cl.world后,以同样的方法创建站点js. world。
(6)创建各主控站点之间的调度链接
创建各主控站点之间的调度链接需要先在各主控站点间建立数据库链接,之后为每个数据库链接定义调度时间。
首先,在处理站点上建立与解释站点的数据库链接,这里需要先建立一个公用数据库链接,供其他私有数据库链接来使用。
connect system/[email protected]
create public database link js.world using ’js.world’;
connect repadmin/[email protected]
create database link js.world connect to repadmin
identified by repadmin;
同样,在解释站点上建立与处理站点的数据库链接
connect system/[email protected]
create public database link cl.world using ’cl.world’;
connect repadmin/[email protected]
create database link cl.world connect to repadmin
identified by repadmin;
调度链接确定本站点上的事务向其他站点发送的频度,下面的代码为10分钟一次:
connect repadmin/[email protected]
begin
dbms_defer_sys.schedule_push (
destination => ’js.world’,
interval => ’sysdate + (1/144)’,
next_date => sysdate,
parallelism => 1,
execution_seconds => 1500,
delay_seconds => 1200);
end;
在解释站点上做相同的工作step2 创建主控组在复制环境中,oracle用组来管理复制对象。通过将相关的复制对象放在一个组里,从而方便对大量数据对象的管理。
这里我们假设用户模式integr ation 在处理站点和解释站点都已存在,而且表测区(survey )和测线(line)也已经创建。
(1)创建主控组对象
connect repadmin/[email protected]
begin
dbms_repcat.create_master_repgroup (
gname => ’inte_repg’);
end;
(2)向主控组中添加数据对象,将测区表survey加入到组inte_repg中
begin
dbms_repcat.create_master_repobject (
gname => ’inte_repg’,
type => ’table’,
oname => ’survey’,
sname => ’integration’,
use_existing_object => true,
copy_rows => false);
end;
以同样的方法将测线表line 加入到组inte_repg中
(3)在主控组中添加其他参与复制的站点,数据库之间的同步方式在此指定
begin
dbms_repcat.add_master_database (
gname => ’inte_repg’,
master => ’js.world’,
use_existing_objects => true,
copy_rows => false,
propagation_mode => ’asynchronous’);
end;
(4)如果可能出现冲突,则需要配置冲突解决方案。冲突解决方案将在后面介绍。
(5)为每个对象生成复制支持
begin
dbms_repcat.generate_replication_support (
sname => ’integration’,
oname => ’survey’,
type => ’table’,
min_communication => true);
end;
测线表line也一样
(6)重新开始复制
begin
dbms_repcat.resume_master_activity (
gname => ’inte_repg’);
end;
以同样的方式设置解释站点。设置成功后,数据复制过程就宣告完毕,库中的数据就可进行复制。
数据复制中冲突的解决方案
在复制环境中,尽管在数据库和应用程序设计过程中,会尽量避免各站点间冲突的发生,但完全避免冲突的可能性还是比较小的,那么一旦冲突发生,就需要一个按照具体业务规则的冲突解决机制,来使得各站点的数据保持一致。
首先需要分析哪些对象容易出现冲突。通常来说,静态的数据变化少,冲突出现的可能性也小;而有些数据变化非常大,冲突出现的可能性也大。确定了冲突易发的对象后,需要确定怎样解决冲突,比如在各站点之间建立优先次序,在数据不一致时,以某个站点上的为
准;或以某个站点上最新的修改为准。
oracle提供了多中冲突解决方案,具体包括:针对更新冲突的方案、针对唯一性冲突的方案、针对删除冲突的方案。除了这些方案以外,用户还可以自定义冲突解决方法。每种方案都有自己的适用情况,那么我们需要根据具体的业务来选择合适的冲突解决方案。
结束语
本文详细介绍了分布式系统oracle中的数据复制技术,在具体应用中,还有许多比较复杂的问题需要解决,比如主控组中如果包含循环依赖的表或自相关的表时如何处理;如何利用模版机制来创建物化视图站点;如何对数据复制环境进行管理与维护。这些问题需要在实际
应用中逐步探索,深入研究。
新闻热点
疑难解答