制节点之间的复制数据一直保持同步
。 4.
Oracle管理工具
很显然
,有效的管理工具对于成功的分布式应用是非常关键的
,如果没有能力去操作它,
再专业的复制功能也不能发挥很好的作用
。Oracle高级复制提供了几个功能强大的管理工具,诸如复制目录,分布式模式管理以及其他的一些Oracle复制管理工具。
1.复制目录
复制目录是一个包含定义复制环境原数据的一个单一综合库。复制目录本身也被复制到多个节点以确保高可用性和授权用户可以简单地实现本地存取管理。
复制目录定义了被复制的数据库对象,复制的节点以及用于复制的机制。数据库对象有需要复制的库表和其他一些相关的对象,如索引,视图,过程,触发器和同义词等等。这些原数据是开放的,用户可以通过标准
SQL语句进行检索和查询。
2.分布式模式管理
Oracle高级复制的分布式模式管理功能允许在一个控制点就可进行复制环境的定义和改变。对复制环境的任何改变,都将自动复制并且应用这些数据定义语言(DDL)命令到其他复制环境节点,同时也利用数据库触发器和复制相关过程自动生成复制所需要的一些支持对象。
分布式模式管理在一个被称为主定义节点的地方进行控制。它自动将DDL推向其他所有主节点并且也允许快照节点"拉"回并且执行这些DDL命令。由于主定义节点使用并且维护着整个复制目录,该复制目录本身也被复制到其他节点,所以该主定义节点一旦出现问题,就必须用其他节点来代替。分布式模式管理可以通过一个图形用户界面管理工具(GUI)来配置。
3. Oracle复制管理器
Oracle复制管理器是Oracle提供的一个图形界面的复制管理工具,通过该工具可以配置,定时和通过一个节点来管理整个的复制环境。该管理工具可以单独运行也可以在Oracle
企业管
采用Oracle复制管理器,用于复制的对象组可以通过一些鼠标操作非常简单地定义。复制组可以包含表和其他相关的对象,如触发器,存储过程,索引,视图,同义词以及序列等。Oracle除了可以复制每个复制组的全部拷贝以外,还可以选择复制数据的子集。复制组的配置可以在任何时候修改,这种变化将自动应用到其他所有的复制节点。一旦定义了对象组,可以通过Oracle复制管理器,简单进行拖拉操作,就可自动部署复制组到一个新的节点。这些快照节点既可以是只读的也可以是可更新的。复制节点配置完成以后,用户可以配置定时以使复制环境中的变化传播到其他节点,当然也可以选择采用同步复制。
4.选择冲突解决方案
如果选择采用一种可以在任何地方更新的复制方案,Oracle复制管理器提供了几个内建的冲突解决方案,诸如"最近时间戳"和"站点优先"等来解决潜在的冲突。对于不同的表可以选择不同的方法,甚至可以对一个表中的不同列选择不同的冲突消除方案。用户对于一些特殊的商业需求也可以创建自己的冲突解决方案。
5.实时管理
通过Oracle的复制管理器,复制环境中任何地方发生的错误均可以非常快速和简单地分离出来并且改正。通过一个单一的节点,用户就可以看到每个节点的延迟事务队列,也可以重新定时或者强制立即执行事务。另外,用户也可以利用Oracle
企业管理器的事件管理功能来对复制环境进行监视,该事件管理器提供了对多个站点间的复制状态的主动监视功能,另外还提供
5.主要配置参数说明示例
首先,数据库要具备高级复制功能(用管理员身份登录数据库,查看v$option视图,如果其中Advanced replication为TRUE,则支持高级复制功能;否则不支持)
数据库基本情况
数据库A 版本oracle 10.2.0.1数据库名sid:myora 地址:19.128.136.208
数据库B 版本oracle 10. 2.0.1数据库名sid:orcl 地址:19.128.136.201
本例涉及的用户.
复制管理员:repadmin
应用用户:fsws_yiliao
本例复制的对象:t数据表
本例的先决条件:你需要设置好相应的参数,job_queue_processes大于0,我的设置为10,global_name=true,并且建立相应的db link.
alter system set global_names=true scope=both;
一.更改两个数据库的全局名称
alter database rename global_name to yiliao.mastre.com;
alter database rename global_name to yiliao.saler.com;
A: yiliao.mastre.com
B: yiliao.saler.com
二.在两个数据库上分别创建应用用户fsws_yiliao
Create connect, resource to fsws_yiliao;
三.在两个数据库上分别创建复制管事员用户REPADMIN
--创建repadmin用户管理复制环境
CREATE USER REPADMIN IDENTIFIED BY REPADMIN default tablespace users;
GRANT connect, resource TO REPADMIN;
--授予repadmin用户权限可以管理当前站点中任何主体组
EXECUTE dbms_repcat_admin.grant_admin_any_schema('REPADMIN');
--授予repadmin用户权限可以为任何表创建snapshot logs
GRANT comment any table TO REPADMIN;
GRANT lock any table TO REPADMIN;
--指定repadmin用户为propagator,并授予执行任何procedure的权限
EXECUTE dbms_defer_sys.register_propagator('REPADMIN');
GRANT execute any procedure TO REPADMIN;
五.在两个数据库repadmin用户上建立数据库链接
create database link yiliao.master.com connect to REPADMIN identified by REPADMIN using 'myora';
create database link yiliao. saler.com connect to REPADMIN identified by REPADMIN using 'orcl';
六.在两个数据库的应用用户t下创建表
在数据库fsws_yiliao用户下创建表t:注意,要进行复制的表必须有主键
CREATE TABLE T(ID NUMBER(10),name varchar2(30));
ALTER TABLE t ADD(CONSTRAINT pk_t_id PRIMARY KEY(ID));
七.在主体定义站点开始操作(数据库A:myora)
以REPADMIN登录数据库
创建复制组:
execute dbms_repcat.create_master_repgroup('master_yiliao');
查询复制组:
select gname,master,status from dba_repgroup;
在复制组里加入复制对象:
execute dbms_repcat.create_master_repobject (sname=>'fsws_yiliao',oname=>'t', type=>'TABLE', use_existing_object=>true,gname=>'master_yiliao',copy_rows=>true);
查询复制组加入的复制对象:
select sname,oname,status,gname from dba_repobject;
对复制对象产生复制支持:
execute dbms_repcat.generate_replication_support('fsws_yiliao','test','TABLE');
在执行下复制组加入的复制对象,这里与加入复制对象是有些区别
select sname,oname,status,gname from dba_repobject;
添加主体复制节点:
execute dbms_repcat.add_master_database(gname=>'master_yiliao',master=>'yiliao. saler.com',use_existing_objects=>true,copy_rows=>true, propagation_mode => 'synchronous');
查询主节点:
select gname,dblink,masterdef,master from dba_repsites;
在主体定义站点启动复制:
execute dbms_repcat.resume_master_activity('master_yiliao',true);
查询下复制主,认真观察下,与开始时的区别
select gname,master,status from dba_repgroup
查询job,看是否运行
select job,log_user,this_date,next_date,next_sec,broken,failures,what from user_jobs;
八.至此配置完成
1)模拟小数据量测试:
insert into t(id, name) values('1', 'aa');
insert into t(id, name) values('2', 'cc');
2)模拟大数据量测试:OK
CREATE OR REPLACE procedure insert_into_t
as
i number;
m NUMBER;
n NUMBER;
BEGIN
n:=0;
FOR i IN 1..10000 LOOP
m:=i;
INSERT INTO t(id, name)VALUES (m, 'cc' || m );
n:=n+1;
IF n=1000 THEN
COMMIT;
n:=0;
END IF;
END LOOP;
COMMIT;
END;
/
加表测试
创建表test(id number);
ALTER TABLE test ADD(CONSTRAINT pk_test_id PRIMARY KEY(ID));
停止主体定义站点复制
execute dbms_repcat.suspend_master_activity('master_yiliao');
在复制组里加入test复制对象:
execute dbms_repcat.create_master_repobject(sname => 'fsws_yiliao', name => 'test', type => 'TABLE', use_existing_object => true, gname => 'master_yiliao', copy_rows => true);
对复制对象产生复制支持:
execute dbms_repcat.drop_master_repobject(sname => 'fsws_yiliao', name => 'test', type => 'TABLE');
重启主体定义站点复制
execute dbms_repcat.resume_master_activity('master_yiliao', true);