《Oracle高级复制技术介绍及应用》引言:Oracle高级复制技术是Oracle最早提出的HA容灾解决方案,起源于Oracle8i系统,至今在11G官方文档上依然可以找到高级复制
高级复制技术是Oracle最早提出的HA容灾解决方案,起源于Oracle 8i系统,至今在11G官方文档上依然可以找到高级复制说明文档。这个技术因为其古老我想大多数80后童靴只闻其声~未闻其形。在生产环境下可能更没有使用过。由于高级复制技术在当下已经属于非主流渐渐的退出了其历史舞台,逐步被Data Guard、Golden Gate、Streams等新技术所代替,导致其没落的原因是由于其本身机制问题,后面我们会介绍其原理和应用场景。虽说这种技术非常的原始,但可能还有一些老系统会继续使用着。一种技术我们需要知道其优点、应用场景、局限性、风险性,这样才能得心应手,有针对性的去使用,例如 原始的汇编语言现在几乎没有人在使用了,但由于其接近硬件的特点,在某些嵌入式系统中效率是最快的。所以说非主流技术我们也应该去了解一下,好的架构师就是需要具备在N种不同技术簇中,选择出最适合的。始终问自己:能不能压缩成本,能不能解决问题,能不能更易用。
《心得体会》
系统不同,架构不同,发现问题解决问题
好架构是系统演进出来的
保持简洁
易于扩展,监控,容错
一 高级复制技术应用架构
,当操作完之后马上触发->传递->应用
(4)和相关复制环境
(6)Master to Master提供节点冗余,负载均衡的复制方式
所有节点关系是对等的,数据是对等的,当其中一个Master不可用时,可以直接切换到其他Master
负载均衡,例如有三个Master相互复制,用户1&2&3可以分别连接这三个Master主节点,实现负载均衡
常用于容灾场景
(7)支持同步和异步复制
同步:可以实时推送,操作后立马触发->复制->应用,因为复制的表上就建立了trigger和package。
异步:可以设置定时job(后台进程控制),定时、批量的复制数据,使用Deferred Transaction Queue实现。
(8)事务和依赖
高级复制自动处理事务的依赖关系,如果B事务访问A事务,并且A事务有更新,称作B事务对A事务有依赖
高级复制自动解决数据的约束关系
高级复制根据分布式事务方式,解决事务的一致性问题,比GG、Streams对事务的控制力更强,对用户操作参与更多,我们应该尽量把用户操作和数据复制分离开来,不要混淆在一起,提高系统的稳定性、健壮性。
(9)基于物化视图的高级复制
对网络质量要求不高,由于非实时传递,因此可以中断
定时、批量的复制数据,直接利用解析物化视图日志的方式复制数据
原理图
------------------------------ ---------------------------------------------------------------------------------
REP LEO1.COM 源库 Y 发送主节点 Y
REP LEO2.COM 目标库 N 接收主节点 Y
目标端也应该可以查出
REPADMIN@leo2> select gname,dblink,masterdef,master from dba_repsites where gname='REP';
GNAME DBLINK MASTERDEF MASTER
------------------------------ -------------------------------------------------------------------------------------------------------------------------------- - -
REP LEO1.COM Y Y
REP LEO2.COM N Y
检查源端和目标端t表内容,应该都没有数据
源端
AR@leo1> select * from t;
no rows selected
目标端
AR@leo2> select * from t;
no rows selected
10.启动复制组rep(就可以实现高级复制了)
REPADMIN@leo1> execute ' 不能访问源库LEO1.COM
ORA-06550: line 1, column 8:
PLS-00201: identifier 'SYS@LEO1.COM' must be declared 必须声明到源库dblink
ORA-06550: line 1, column 8:
PL/SQL: Statement ignored
ORA-06550: line 1, column 7:
PLS-00352: Unable to access another database 'LEO1.COM'
ORA-06550: line 1, column 7:
PLS-00201: identifier 'SYS@LEO1.COM' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
ORA-06512: at "SYS.DBMS_REPCAT_MAS", line 864
解决方法
目标端创建到源端dblink,因为两端有信息交互,必须相通
REPADMIN@leo2> create database link leo1.com connect to repadmin identified by oracle using 'leo1';
Database link created.
必须重启复制组rep
REPADMIN@leo1> execute dbms_repcat.suspend_master_activity('rep'); 暂停
PL/SQL procedure successfully completed.
REPADMIN@leo1> execute dbms_repcat.resume_master_activity('rep',true); 重启
PL/SQL procedure successfully completed.
直到源端和目标端的t表上都生成内部触发器、存储过程、基表才能正常复制
REPADMIN@leo1> select sname,oname,gname,status from dba_repobject where gname='REP';
SNAME ONAME GNAME STATUS
------------------------------ ------------------------------ ------------------------------ ----------
AR T REP VALID
AR T$RP REP VALID
AR T$RP REP VALID
参考官方文档地址:Database Advanced Replication Management API Reference书中的DBMS_REPCAT部分
目标端,当目标库t表上有这些东西时就可以正常复制了
REPADMIN@leo2> select sname,oname,gname,status from dba_repobject where gname='REP';
SNAME ONAME GNAME STATUS
------------------------------ ------------------------------ ------------------------------ ----------
AR T REP VALID
AR T$RP REP VALID
AR T$RP REP VALID
再次测试
源库,插入两条记录,当提交之后才会复制到目标库
AR@leo1> insert into t values(1);
1 row created.
AR@leo1> select * from t;
X
----------
1
AR@leo1> insert into t values(2);
1 row created.
AR@leo1> select * from t;
X
----------
1
2
AR@leo1> commit;
Commit complete.
目标库
AR@leo2> select * from t;
X
----------
1
2
源端,更新操作,提交之后才会传到目标库
AR@leo1> update t set x=10 where x=1;
1 row updated.
AR@leo1> update t set x=20 where x=2;
1 row updated.
AR@leo1> commit;
Commit complete.
目标端
AR@leo2> select * from t;
X
----------
10
20
DDL操作测试,上面我们说过了高级复制是不支持DDL操作的
源端
AR@leo1> truncate table t;
Table truncated.
AR@leo1> select * from t;
no rows selected
目标端并没有被清空,源端的DDL操作并不会影响到目标端的
AR@leo2> select * from t;
X
----------
10
20
自动解决数据的约束关系,GG、Streams就不会自动解决
源库
AR@leo1> insert into t values(10);
insert into t values(10)
*
ERROR at line 1:
ORA-00001: unique constraint (AR.SYS_C007046) violated 违反唯一约束
ORA-02063: preceding line from LEO2 来自于LEO2
说明:这个约束警告并不是源库t表上的有问题,而是当事务发生后高级复制会立刻自动检查两端的数据约束关系,
当发现目标库t表中有10这个值时,会立刻发出警告,,这个警告说明的是目标库上违反了约束关系~全局约束。
AR@leo2> select * from t;
X
----------
10
20
全局约束:这是由分布式事务引起的,如果发现整个分布式环境中有约束冲突的话,就会告警。
我们插入30,就没有问题,感觉比GG、streams速度还要快
AR@leo1> insert into t values(30);
1 row created.
AR@leo1> commit;
Commit complete.
AR@leo2> select * from t;
X
----------
10
20
30