欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

《Oracle 高级复制技术介绍及应用》-HA技术-应用场景-实战演练

程序员文章站 2022-06-06 12:04:04
...

《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