`
king_tt
  • 浏览: 2122740 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Oracle10G多台服务器同步高级复制

 
阅读更多

需求:公司网站需要在北京网通和上海电信建两台Oracle10G服务器,数据必须实时同步,本来准备用物理镜向的RAC,但它对于数据通信占用流太大,而它的主要功能是做为分步式数据备份使用,而现在公司需求是两台数据时实同步,所以选择实时高级复制;

环境:Oracle版本10.2.0.1,安装路径无限制,北京glabol_name为:db.bj.com,上海glabol_name为:sh.bj.com

首先,数据库要具备高级复制功能(用system身份登录数据库,查看v$option视图,如果其中Advanced replication为TRUE,则支持高级复制功能;否则不支持)

查看是否支持高级手复制
select value from v$option where parameter='Advanced replication';.
一.数据库基本情况

因为上海和北京的网站都运用同一个SID,所以SID为一样,而sevice_name必须为同一域名;
数据库上海 版本oracle 10.2.0.1 数据库名sid:db 服务名:db.sh.com
数据库北京 版本oracle 10.1.0.3 数据库名sid:db 服务名:db.bj.com
主体定义站点上海: db
主体站点上海: db
北京IP:210.44.185.201
上海IP:222.74.85.193
注:主体定义站点指配置复制工作的站点
本例涉及的用户.
复制管理员:repadmin
应用用户:cqm
本例复制的对象:reptest 数据表
本例的先决条件:你需要设置好相应的参数,job_queue_processes需要大于0,global_name=true,并且建立相应的db link.
alter system set global_names=true scope=both;

二.在两个数据库上分别创建应用用户CQM
CREATE USER CQM IDENTIFIED BY CQM DEFAULT TABLESPACE users TEMPORARY TABLESPACE TEMP;
GRANT DBA TO CQM;
三.在两个数据库上分别创建复制管事员用户REPADMIN
--创建repadmin用户管理复制环境
CREATE USER REPADMIN IDENTIFIED BY abc123;
ALTER USER REPADMIN DEFAULT TABLESPACE USERS;
ALTER USER REPADMIN TEMPORARY TABLESPACE TEMP;
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;

四.更改两个数据库的全局名称,如果一开始建库时就设好了service_name,这一步就可以不做了
上海:alter database rename global_name to db.sh.com;

北京:alter database rename global_name to db.bj.com;

五.在两个数据库上分别建立数据库链接:紫色为repadmin密码
上海db.sh.com:create public database link
db.bj.com connect to REPADMIN identified byabc123 using'(description=(address_list=(address=(protocol=tcp)(host=210.44.185.201)(port=1521)))(connect_data=(sid=db)(server=dedicated)))';
北京db.bj.com:create public database link
db.sh.com connect to REPADMIN identified by abc123 using'(description=(address_list=(address=(protocol=tcp)(host=222.74.85.193)(port=1521)))(connect_data=(sid=db)(server=dedicated)))';

六.在两个数据库的应用用户CQM下创建表
在数据库db.sh.com上用户CQM下,当然如果你的cqm用户已有数据表就可不再建表:
注意,要进行复制的表必须有主键,高级复制的同步依据就是主键,所以主键为必要条件:
CREATE TABLE TEST(ID NUMBER(10),TIMESTAMP DATE DEFAULT sysdate);
ALTER TABLE TEST ADD(CONSTRAINT TEST_PK PRIMARY KEY(ID));
insert into test(id) values(1);
在数据库db.bj.com上用户CQM下:
CREATE TABLE TEST(ID NUMBER(10),TIMESTAMP DATE DEFAULT sysdate);
ALTER TABLE TEST ADD(CONSTRAINT TEST_PK PRIMARY KEY(ID));
七.在主体定义站点开始操作(数据库db.sh.com)
以REPADMIN登录数据库db
--创建复制组:
execute dbms_repcat.create_master_repgroup('repg');
--在复制组里加入复制对象:
execute dbms_repcat.create_master_repobject(sname=>'cqm',oname=>'test',type=>'table',use_existing_object=>true,gname=>'repg',copy_rows=>false);
--对复制对象产生复制支持:
execute dbms_repcat.generate_replication_support('cqm','test','table');
--添加主体复制节点:
execute dbms_repcat.add_master_database(gname=>'repg',master=>'db.bj.com',use_existing_objects=>true,copy_rows=>false, propagation_mode => 'synchronous');
--在主体定义站点启动复制:
execute dbms_repcat.resume_master_activity('repg',true);
八.至此配置完成
测试

九:注意事项,在建好复制同步后,看两个数据的处理请求(用控制台进去后,点-分配-高级复制-管理中的拓朴图),要请他本身处理请求完成后(设置的同步表越多,请求就越多,请慢慢等待),再测试数据同步,由于太心急,我做前几次时都在它本身处理请求没完成时测试老是测试不成功,直接至重设了好几次;

十:后台设置;

如果想再加入其它表的同步

1.停止服务:execute dbms_repcat.suspend_master_activity(gname=>'repg');
2.添加复制对象:execute dbms_repcat.create_master_repobject(sname=>'cqm',oname=>
'test1',type=>'table',use_existing_object=>true,gname=>'repg',copy_rows=>false);
3.为对像生成复制支持:execute dbms_repcat.generate_replication_support('cqm','
test1','table');
4.再启动服务:execute dbms_repcat.resume_master_activity('repg',true);

注意,如有多个对像,请重复执行2和3步骤;

相关问题:

数据库同步之后,随之而来的问题就是,如果数据库里每个表都是以自增ID为主键的话(oracle的自增字段为序列+触发器实现),而我们只设置表同步,序列是没有办法进行同步的,而序列是只要查询一次就会自增加1,如果sh数据插入一条不成功,而第二第成功的话,就会形成ID不一致现象,如下所示:

sh bj

表t_a,序列se_a,下一ID:1120 表t_a,序列se_a,下一ID:1120

插入失败:se_a也会+1为1121而数据不成功也就不同步,bj还是1120

第二次插入成功:se_a+1为1122 数据成功同步,bj的se_a+1 为:1121

这样也就形成了北京和上海数据同步而ID不一致,如果你的表中使用了clob字段,这样的话clob字段也会为影响为null,

解决方案为:如果sh为主库,bj为负库,也就是说这个t_a的表只有上海为插入删除操作,北京只是查询,最简单的就是把北京的序列的触发器册除,即可;如果上海和北京都对t_a表都有插入删除操作,也就是双向同步,那就要使上海和北京的ID序列不一样就行,如北京以1开始,而上海以900000001开始,再修改触发器:

原触发器为:select se_a.nextval into:new.id from dual;
修改为:if :new.id is null then
select se_a.nextval into:new.id from dual;
end if;

即可;


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics