《Oracle 高级复制技术介绍及应用》-HA技术-应用场景-实战演练
《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

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Python 中的 deque 是一个低级别的、高度优化的双端队列,对于实现优雅、高效的Pythonic 队列和堆栈很有用,它们是计算中最常见的列表式数据类型。本文中,云朵君将和大家一起学习如下:开始使用deque有效地弹出和追加元素访问deque中的任意元素用deque构建高效队列开始使用Deque向 Python 列表的右端追加元素和弹出元素的操作,一般非常高效。如果用大 O 表示时间复杂性,那么可以说它们是 O(1)。而当 Python 需要重新分配内存来增加底层列表以接受新的元素时,这些

随着Web应用的不断发展,我们需要处理大量的任务来保持应用的稳定性和可用性。使用队列系统就是一种解决方案。ThinkPHP6提供了内置的队列系统来管理任务。然而,处理大量的任务需要更好的队列管理,这时候可以使用Supervisor来实现。本文将介绍如何使用Supervisor管理ThinkPHP6队列。在此之前,我们需要了解一些基础的概念:队列系统队列系统是

队列技术在PHP与MySQL中的消息延迟和消息重试的应用摘要:随着Web应用程序的不断发展,对于高并发处理和系统可靠性方面的需求越来越高。队列技术作为一种解决方案,被广泛应用于PHP与MySQL中,以实现消息延迟和消息重试的功能。本文将介绍队列技术在PHP与MySQL中的应用,包括队列的基本原理、使用队列实现消息延迟的方法和使用队列实现消息重试的方法,并给出

JavaQueue队列的性能分析与优化策略摘要:队列(Queue)是在Java中常用的数据结构之一,广泛应用于各种场景中。本文将从性能分析和优化策略两个方面来探讨JavaQueue队列的性能问题,并给出具体的代码示例。引言队列是一种先进先出(FIFO)的数据结构,可用于实现生产者-消费者模式、线程池任务队列等场景。Java提供了多种队列的实现,例如Arr

Java中的队列是一种线性数据结构,具有多种功能。队列有两个端点,它遵循先进先出(FIFO)原则插入和删除其元素。在本教程中,我们将了解Java中队列的两个重要函数,它们是add()和Offer()。什么是队列?java中的队列是一个扩展了util和collection包的接口。元素在后端插入并从前端移除。java中的队列可以使用链表、DeQueue、优先级队列等类来实现。优先级队列是普通队列的扩展形式,每个元素都有一个优先级。队列的add()方法该方法用于向队列中插入元素。它将定义的元素(作为

队列在PHP与MySQL中的任务监控和任务调度的实现方案引言在现代的Web应用程序开发中,任务队列是非常重要的一项技术。通过队列,我们可以将一些需要在后台执行的任务排队,并通过任务调度来控制任务的执行时间和顺序。本文将介绍如何在PHP与MySQL中实现任务的监控和调度,并提供具体的代码示例。一、队列的工作原理队列是一种先进先出(FIFO)的数据结构,可以用来

PHP邮件队列系统的原理和实现方式是什么?随着互联网的发展,电子邮件已经成为人们日常生活和工作中必不可少的通信方式之一。然而,随着业务的增长和用户数量的增加,直接发送电子邮件可能会导致服务器性能下降、邮件发送失败等问题。为了解决这个问题,可以使用邮件队列系统来通过串行队列的方式发送和管理电子邮件。邮件队列系统的实现原理如下:邮件入队列当需要发送邮件时,不再直

随着互联网的快速发展,应用程序对于处理大量并发请求和任务变得越来越重要。在这样的情况下,处理异步任务是必不可少的,因为这可以使应用程序更加高效,并更好地响应用户请求。Yii框架提供了一个方便的队列组件,使得处理异步操作更加容易和高效。在本篇文章中,我们将探讨Yii框架中队列的使用和优势。什么是队列队列是一种数据结构,用于处理数据的先进先出(FIFO)顺序。队
