前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Oracle 19c 新特性:ADG的自动DML重定向增强读写分离

Oracle 19c 新特性:ADG的自动DML重定向增强读写分离

作者头像
数据和云
发布2019-03-07 17:42:04
1.2K0
发布2019-03-07 17:42:04
举报
文章被收录于专栏:数据和云数据和云

在前面的文章《Oracle 19c 十大新特性一览》中,我们曾经提到 Oracle 19c的一个重要增强,就是ADG的自动DML转发:

这个新特性的功能是:将偶然发送到ADG上的DML操作,自动转发到主库执行,然后通过主库日志传递到备库实时应用,在保证了ACID的前提下,大大增强了备库的实用性,这被称为 DML Redirection 。

其实这个特性在 Oracle 18c 中就已经提供,所以我们不必等到 19c 就能够体验到这个特性。

在两个版本中,唯一的差别是:

在 18c 中,这个特性是通过隐含参数 _enable_proxy_adg_redirect 的调整来启用这个特性,这表示此特性是趋向内部的; 在 19c 中,显式参数 ADG_REDIRECT_DML 参数控制这个特性的开关,说明这个特性变成外部和成熟的;

来看一下测试,体验一下这个新特性的便利性。首先在主库建立测试表,插入测试数据:

[oracle@18.0.0]$ export ORACLE_SID=DB18C [oracle@18.0.0]$ sqlplus / as sysdba Connected to: Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production SQL> create user eygle identified by eygle; User created. SQL> grant connect,resource,dba to eygle; Grant succeeded. SQL> connect eygle/eygle Connected. SQL> create table enmotech (id number,name varchar2(20)); Table created. SQL> insert into enmotech values(1,'EYGLE'); 1 row created. SQL> commit; Commit complete. SQL> select open_mode from v$database; OPEN_MODE -------------------- READ WRITE

接下来在备库中就设置了参数之后,就可以针对表执行DML操作了,注意备库需要置于实时应用状态:

[oracle@18.0.0]$ export ORACLE_SID=DB18C_S [oracle@18.0.0]$ sqlplus eygle/eygle Connected to: Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production SQL> select open_mode from v$database; OPEN_MODE -------------------- READ ONLY WITH APPLY SQL> select * from enmotech; ID NAME ---------- -------------------- 1 EYGLE SQL> alter session set "_enable_proxy_adg_redirect"=true; Session altered. SQL> show parameter redirect NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ _adg_redirect_flags integer 1 _enable_proxy_adg_redirect boolean TRUE -- 此处启用跟踪,可以分析 ADG 重定向的工作原理 SQL> alter session set events '10046 trace name context forever ,level 12'; Session altered. --此处的DML操作可以顺利执行 SQL> insert into enmotech values(2,'YANGTINGKUN'); 1 row created. SQL> select * from enmotech; ID NAME ---------- -------------------- 1 EYGLE 2 YANGTINGKUN SQL> commit; Commit complete.

在以上测试中,可以通过设置10046跟踪,以获得后台的递归执行,研究这个特性的工作原理。

也可以设置终端输出时间,评估重定向的延时,我的测试环境搭建在同一台主机,基本上DML操作的延时在1秒左右,偶发情况下是完全可以接受的:

SQL> set timing on SQL> insert into enmotech values(2,'KAMUS'); 1 row created. Elapsed: 00:00:01.05 SQL> select * from enmotech; ID NAME ---------- -------------------- 1 EYGLE 2 YANGTINGKUN 2 KAMUS Elapsed: 00:00:00.00 SQL> commit; Commit complete. Elapsed: 00:00:01.05

通过后台的跟踪日志,可以看到,DML操作是通过DB Link来重定向到主库执行的,这个DB Link是内部的,在服务名等配置正常情况下,Oracle能够自动完成内部操作,如果配置错误则会出现错误:

===================== PARSING IN CURSOR #139880746795960 len=44 dep=0 uid=107 oct=2 lid=107 tim=45368825051292 hv=3193100945 ad='674870e8' sqlid='3bg4wy2z55qnj' insert into enmotech values(2,'YANGTINGKUN') END OF STMT PARSE #139880746795960:c=44993,e=1721825,p=1,cr=28,cu=6,mis=1,r=0,dep=0,og=1,plh=0 WAIT #139880746795960: nam='SQL*Net message to dblink' ela= 2 WAIT #139880746795960: nam='SQL*Net message from dblink' ela= 1164 EXEC #139880746795960:c=1000,e=1297,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=1,plh=0 WAIT #139880746795960: nam='SQL*Net message to dblink' ela= 1 WAIT #139880746795960: nam='SQL*Net vector data to dblink' ela= 82 WAIT #139880746795960: nam='SQL*Net message from dblink' ela= 1280 *** 2019-01-10T21:08:37.292860+08:00 WAIT #139880746795960: nam='standby query scn advance' ela= 850283 WAIT #139880746795960: nam='PGA memory operation' ela= 98 p1=0 p2=0 WAIT #139880746795960: nam='SQL*Net message to client' ela= 2 d ===================== PARSING IN CURSOR #139880746795960 len=6 dep=0 uid=107 oct=44 lid=107 tim=45368881823728 hv=3480936638 ad='0' sqlid='23wm3kz7rps5y' commit END OF STMT PARSE #139880746795960:c=0,e=150,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=0,plh=0 XCTEND rlbk=0, rd_only=1, tim=45368881823795 WAIT #139880746795960: nam='SQL*Net message to dblink' ela= 2 WAIT #139880746795960: nam='SQL*Net message from dblink' ela= 1598 *** 2019-01-10T21:09:34.259699+08:00 WAIT #139880746795960: nam='standby query scn advance' ela= 1045191 EXEC #139880746795960:c=1000,e=1047570,p=0,cr=0,cu=4,mis=0,r=0,dep=0,og=0,plh=0 WAIT #139880746795960: nam='SQL*Net message to client' ela= 3

除了常规表之外,Oracle 还支持在备库创建全局临时表,在19c中,隐含参数 _alter_adg_redirect_behavior 可以用于定义允许重定向的级别,例如当设置 disallow_gtt 将不允许重定向全局临时表

ADG 中 DML 重定向新特性带来的另外一个问题时,以后部署ADG时,必须注意备库安全管控,否则滥发到备库的DML可能损害主库的一致性。

这些变化告诉我们的是:时移世易,当新的版本和特性被引入时,一定会带来新的变化,如果不能及时了解这些变化,在享受便利的情况下,就可能面临意外的风险

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-02-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据和云 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档