数据库双向同步复制
--0. 数据库双向同步复制准备
--************************************************************************
-- 两个数据库(SID): db1, db2
-- Listener端口号 1521 1521
-- Host Name: testHost
-- 在将要执行复制脚本的机器上,创建连接db1, db2的 net_service_name: db1, db2
-- 检查你的数据库是否支持高级复制 :
-- select * from v$option where PARAMETER='Advanced replication';
--************************************************************************
-- 1.建公共的数据库链接 ,创建复制管理用户repadmin
-- ===========================================
-- 需要修改以下两个主机名 :host1_name, host2_name
define host1=host1_name
define host2=host2_name
-- 如果是在两台不同的机器上,请定义不同的hostname(或IP)即可.
-- 用sys身份登录 db1 数据库
conn sys/oracle@db1 as sysdba
drop public database link db2;
create public database link db2 using '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = &&host2 )(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME =
db2)))'
;
-- 创建复制管理用户repadmin
drop user repadmin cascade;
create user repadmin identified by repadmin
default tablespace users temporary tablespace temp;
execute dbms_defer_sys.register_propagator('repadmin');
grant execute any procedure to repadmin;
execute dbms_repcat_admin.grant_admin_any_repgroup('repadmin');
grant comment any table to repadmin;
grant lock any table to repadmin;
execute DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_SCHEMA (username => 'repadmin');
-- 用sys身份登录 db2 数据库
conn sys/oracle@db2 as sysdba
drop public database link db1;
create public database link db1 using '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = &&host1 )(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME =
db1)))'
;
-- 创建复制管理用户repadmin
drop user repadmin cascade;
create user repadmin identified by repadmin
default tablespace users temporary tablespace temp;
execute dbms_defer_sys.register_propagator('repadmin');
grant execute any procedure to repadmin;
execute dbms_repcat_admin.grant_admin_any_repgroup('repadmin');
grant comment any table to repadmin;
grant lock any table to repadmin;
execute DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_SCHEMA (username => 'repadmin');
-- 2 . db1, db2上各创建一个测试用户 和一个用于测试数据复制的测试表
--===========================================
----连接到db1 创建
conn sys/oracle@db1 as sysdba
drop user test cascade;
create user test identified by test
default tablespace users temporary tablespace temp;
alter user test quota unlimited on users;
grant create session,create table,create view to test;
conn test/test@db1
create table emp (id number , name varchar2(20),DEPTID NUMBER);
alter table emp add constraint pk_emp_id primary key(id);
insert into emp values(2,'Klll',108);
commit;
--连接到db2 创建
conn sys/oracle@db2 as sysdba
drop user test cascade;
create user test identified by test
default tablespace users temporary tablespace temp;
alter user test quota unlimited on users;
grant create session,create table,create view to test;
conn test/test@db2
create table emp (id number , name varchar2(20),DEPTID NUMBER);
alter table emp add constraint pk_emp_id primary key(id);
insert into emp values(2,'hello',108);
commit;
--3 . 创建私有数据库链接。
--===========================================
conn repadmin/repadmin@db1
-- db1
create database link db2 connect to repadmin identified by repadmin;
-- 测试数据库全局名称和公共的数据库链接
select * from global_name@db2;
conn repadmin/repadmin@db2
-- db2
create database link db1 connect to repadmin identified by repadmin;
-- 测试数据库全局名称和公共的数据库链接
select * from global_name@db1;
--4 创建复制组 rep_group ,加入数据库对象,产生对象的复制支持
-- repadmin身份登录db1
conn repadmin/repadmin@db1
execute dbms_repcat.drop_master_repgroup(gname=>'rep_group',drop_contents=>TRUE,all_sites=>true);
execute dbms_repcat.create_master_repgroup('rep_group');
--在复制组rep_group里加入数据库对象
execute dbms_repcat.create_master_repobject(sname=>'test',oname=>'emp', type=>'table',use_existing_object=>true,gname=>'rep_group');
--sname 用户名称
--oname 数据库对象名称
-- type 复制对象类别:表,索引,同义词,触发器,视图,过程,函数,程序包,程序包体
-- use_existing_object true 使用在主复制节点已经存在的数据库对象
-- gname 主复制组名
-- 产生对数据库对象的复制支持
execute dbms_repcat.generate_replication_support('test','emp','table');
-- 5、创建主复制节点
-- repadmin登录db1数据库,创建主复制节点
execute dbms_repcat.add_master_database(gname=>'rep_group',master=>'db2',use_existing_objects=>true, copy_rows=>false, propagation_mode => 'asynchronous');
-- gname 主复制组名
--master 加入主复制节点的另一个数据库
--use_existing_object true表示用主复制节点已经存在的数据库对象
--copy_rows false表示第一次开始复制时不用和主复制节点保持一致
--propagation_mode 异步地执行
-- 确认复制的任务队列已经加入数据库的数据字典
--6. 使同步组的状态由quiesced改为正常(normal)
-- repadmin登录db1数据库
execute dbms_repcat.resume_master_activity('rep_group',true);
-- 确认同步组的状态为正常(normal)
select gname, master, status from dba_repgroup;
--7. 创建复制数据库的时间表,1/10分钟(1/14400)复制一次。
-- repadmin身份登录db1数据库 ,执行
begin
dbms_defer_sys.schedule_push (
destination => 'db2',
interval => 'sysdate + 1/14400',
next_date => sysdate);
end;
/
begin
dbms_defer_sys.schedule_purge (
next_date => sysdate,
interval => 'sysdate + 1/14400',
delay_seconds => 0,
rollback_segment => '');
end;
/
-- repadmin 身份登录db2数据库,运行以下命令
conn repadmin/repadmin@db2
begin
dbms_defer_sys.schedule_push (
destination => ' db1',
interval => 'sysdate + 1/ 14400',
next_date => sysdate);
end;
/
begin
dbms_defer_sys.schedule_purge (
next_date => sysdate,
interval => 'sysdate + 1/14400',
delay_seconds => 0,
rollback_segment => '');
end;
/
commit ;
--8. 添加或修改两边数据库表test.emp的记录,并检测这两个表中的数据是否同步。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8102208/viewspace-557685/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/8102208/viewspace-557685/