linux mysql双向同步_数据库双向同步复制

数据库双向同步复制

--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 数据库

connsys/oracle@db1as 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 数据库

connsys/oracle@db2as 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 创建

connsys/oracle@db1as 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;

conntest/test@db1create 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 创建

connsys/oracle@db2as 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;

conntest/test@db2create 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 . 创建私有数据库链接。

--===========================================

connrepadmin/repadmin@db1-- db1

create database link db2 connect to repadmin identified by repadmin;

-- 测试数据库全局名称和公共的数据库链接

select * fromglobal_name@db2;

connrepadmin/repadmin@db2-- db2

create database link db1 connect to repadmin identified by repadmin;

-- 测试数据库全局名称和公共的数据库链接

select * fromglobal_name@db1;

--4 创建复制组 rep_group ,加入数据库对象,产生对象的复制支持

-- repadmin身份登录db1

connrepadmin/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数据库,运行以下命令

connrepadmin/repadmin@db2begin

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的记录,并检测这两个表中的数据是否同步。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值