利用oracle高级复制功能实现数据同步的问题

来源:互联网 发布:网络精灵pipopa第二季 编辑:程序博客网 时间:2024/04/30 12:10
/* 从DPS到EMIS,表dpsuser.gg_web_info_m */
/* 首先确保在EMIS数据库中已经建立了dpsuser和相应的表空间dpsdata */
/* 第一步,配置主体端 */
connect system
/manager@dps
grant connect,dba,resource to dpsuser;

/* 创建复制管理员repadmin */
create user repadmin identified by repadmin;
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;

/* 分配proxy snapshot administration权限给repadmin,list_of_gnames为null,意味着可以管理所有对象组 */
begin
dbms_repcat_admin.register_user_repgroup(
username 
=> 'repadmin',
privilege_type 
=> 'proxy_snapadmin',
list_of_gnames 
=> null);
end;
/

/* 分配'receiver'权限给repadmin */
begin
dbms_repcat_admin.register_user_repgroup(
username 
=> 'repadmin',
privilege_type 
=> 'receiver',
list_of_gnames 
=> null);
end;
/
grant select any table to repadmin;

/* 以repadmin身份登录 */
connect repadmin
/repadmin@DPS
/* 在DPS上建立主体组,主体组名为REP_DPS,并往主体组中加入一个表 */
/* 建立主体组 */
begin
dbms_repcat.create_master_repgroup(
gname 
=> 'rep_dps',
qualifier 
=> '',
group_comment 
=> '');
end;
/
/* 向主体组中加入表gg_web_info_m */
begin
dbms_repcat.create_master_repobject(
gname 
=> 'rep_dps',
type 
=> 'table',
oname 
=> 'gg_web_info_m',
sname 
=> 'dpsuser',
copy_rows 
=> true,
use_existing_object 
=> true);
end;
/

/* 建立相应的快照日志 */
create snapshot log
on dpsuser.gg_web_info_m
tablespace system
with primary key
excluding new 
values;

/* 生成复制支持 */
begin
dbms_repcat.generate_replication_support(
sname 
=> 'dpsuser',
oname 
=> 'gg_web_info_m',
type 
=> 'table',
min_communication 
=> true,
generate_80_compatible 
=> false);
end;
/

/* 第二步,配置快照端 */
connect system
/manager@emis

/* 修改用户权限 */
grant connect,dba,resource to dpsuser;

/* 创建复制管理员repadmin */
create user repadmin identified by repadmin;
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;

/* 授予repadmin用户可以创建快照 */
grant create any snapshot to repadmin;
grant alter any snapshot to repadmin;

/*在EMIS服务器上添加到DPS的连接,可以通过修改tnsnames.ora实现 */

/* 在EMIS建立与DPS的数据库链接 */
create public database link dps connect to repadmin identified by repadmin using 'dps';

/* 在EMIS建立刷新组ref_dps */
begin
dbms_refresh.make(
name 
=> 'dpsuser.ref_dps',
list 
=> '',
next_date 
=> sysdate,
interval 
=> '/*1:Secs*/ sysdate + 1/(60*60*24)',
implicit_destroy 
=> false,
lax 
=> false,
job 
=> 0,
rollback_seg 
=> null,
push_deferred_rpc 
=> true,
refresh_after_errors 
=> true,
purge_option 
=> null,
parallelism 
=> null,
heap_size 
=> null);
end;
/


/* 在EMIS建立快照组 同步为synchronous,异步为asynchronous*/
begin
dbms_repcat.create_snapshot_repgroup(
gname 
=> 'rep_dps',
master 
=> 'dps',
propagation_mode 
=> 'asynchronous');
end;
/

/*建立快照,快照要在表所属的用户下建立,所以要先用dpsuser登陆 */
connect dpsuser
/dps@emis

/* 建立gg_web_info_m的快照 */
create snapshot dpsuser.gg_web_info_m
build immediate
refresh force
next sysdate + 1/86400
for update
as
select * from dpsuser.gg_web_info_m@dps;

/* 将快照加入刷新组 */
begin
dbms_refresh.
add(
name 
=> 'dpsuser.ref_dps',
list 
=> 'dpsuser.gg_web_info_m',
lax 
=> true);
end;
/

/* 将快照加入快照组 */
begin
dbms_repcat.create_snapshot_repobject(
gname 
=> 'rep_dps',
sname 
=> 'dpsuser',
oname 
=> 'gg_web_info_m',
type 
=> 'snapshot',
min_communication 
=> false);
end;
/

/* 第三步,在DPS端激活主体组 */
connect system
/manager@dps
begin
dbms_repcat.resume_master_activity(
gname 
=> 'rep_dps');
end;
/