ITPub博客

首页 > 数据库 > Oracle > Oracle 19c 新特性:ADG的自动DML重定向增强读写分离--ADG_REDIRECT_DML

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

原创 Oracle 作者:lhrbest 时间:2019-09-05 11:02:18 0 删除 编辑



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



Oracle 19c 新特性之一,adg的自动 dml 重定向.就是在 ADG 环境下,连接到 standby 的数据库执行 dml.


这个特性在 18c 是作为隐含参数 _enable_proxy_adg_redirect 调整的,


但在 19c 中,通过显式参数 ADG_REDIRECT_DML 参数调整.


SQL> show parameter adg_redirect_dml;


NAME      TYPE VALUE

------------------------------------ ----------- ------------------------------

adg_redirect_dml      boolean FALSE



默认是 false


在 primary 和 standby 都均打开


SQL> alter system set adg_redirect_dml = true scope = both sid = '*';


测试后发现是通过 dblink 的方式去 primay 执行 dml,所以需要监控 standby 的 2pc 的异常.


参考:

https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/ADG_REDIRECT_DML.html#GUID-AC98F026-33BE-41FE-8F2F-EFA296723AD8


https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/release-changes.html#GUID-509A6343-5882-4260-BAD0-DC6B2BDC8301



说明

在19c版本中,ADG中的备库支持DML操作,原理是:是通过将备库上的DML重定向到主库上执行,然后备库应用DML变化数据,至此完成备库DML操作。


注:避免在备库上执行过多的DML操作,实际上是在主库上执行。


不支持XA事务中的DML操作。


配置

自动重定向DML操作支持会话级别和系统级别,会话级别会覆盖系统级别配置。


在所有备库上启用DML重定向

将初始化参数ADG_REDIRECT_DML设置为true

ALTER SYSTEM SET ADG_REDIRECT_DML=true SCOPE=BOTH;


当前会话启用DML重定向

ALTER SESSION ENABLE ADG_REDIRECT_DML;


具体例子

会话级别的DML重定向

确认当前数据库角色


SQL>  select open_mode,database_role from v$database;


OPEN_MODE                                DATABASE_ROLE

---------------------------------------- --------------------------------

READ ONLY WITH APPLY                     PHYSICAL STANDBY


在备库上启用会话级别DML重定向


SQL> conn system/oracle   --非sys用户

Connected.

SQL> ALTER SESSION ENABLE ADG_REDIRECT_DML;

Session altered.


确认表数据


  SQL> select * from test;


  no rows selected


在备库上执行DML操作


SQL> insert into test values(1);

1 row created.


SQL> select * from test;


      ID

  ----------

       1


注意:不支持sys用户会话启用:ORA-16397: statement redirection from Oracle Active Data Guard standby database to primary database failed


错误可能原因:


[oracle@19dg_p admin]$ oerr ORA 16397

16397, 00000, "statement redirection from Oracle Active Data Guard standby database to primary database failed"

// *Cause:  The statement redirection failed because of one of the following reasons:

//          1. The primary database connect string was not established.

//          2. The primary database could not be reached.

//          3. The undo-mode or incarnation were not the same.

//          4. The current user and logged-in user were not the same.

//          5. Redirecting CREATE TABLE AS SELECT (CTAS) of the global temporary

//             table was not supported.

//          6. Redirecting PL/SQL execution having bind variable was not supported.

// *Action: Run the statement after fixing the condition that caused the failure.



系统级别启用DML重定向

查看ADG_REDIRECT_DML参数值

SQL> SHOW PARAMETER ADG_REDIRECT_DML;


NAME                                 TYPE

------------------------------------ ----------------------

VALUE

------------------------------

adg_redirect_dml                     boolean

FALSE


在备库上设置为true

SQL> ALTER SYSTEM SET ADG_REDIRECT_DML=true SCOPE=BOTH;


System altered.


执行DML

 SQL> conn system/oracle

 Connected.


 SQL> insert into system.test values(2);

 1 row created.


 SQL> COMMIT;


 Commit complete.


验证数据

 SQL> select * from system.test;


         ID

 ----------

         1

         2


以上就是关于ADG中备库DML重定向特性测试,



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

640?wx_fmt=jpeg

这个新特性的功能是: 将偶然发送到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可能损害主库的一致性。








About Me

........................................................................................................................

● 本文作者:小麦苗,部分内容整理自网络,若有侵权请联系小麦苗删除

● 本文在itpub、博客园、CSDN和个人微 信公众号( xiaomaimiaolhr)上有同步更新

● 本文itpub地址: http://blog.itpub.net/26736162

● 本文博客园地址: http://www.cnblogs.com/lhrbest

● 本文CSDN地址: https://blog.csdn.net/lihuarongaini

● 本文pdf版、个人简介及小麦苗云盘地址: http://blog.itpub.net/26736162/viewspace-1624453/

● 数据库笔试面试题库及解答: http://blog.itpub.net/26736162/viewspace-2134706/

● DBA宝典今日头条号地址: http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826

........................................................................................................................

● QQ群号: 230161599 、618766405

● 微 信群:可加我微 信,我拉大家进群,非诚勿扰

● 联系我请加QQ好友 646634621 ,注明添加缘由

● 于 2019-09-01 06:00 ~ 2019-09-31 24:00 在西安完成

● 最新修改时间:2019-09-01 06:00 ~ 2019-09-31 24:00

● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

● 版权所有,欢迎分享本文,转载请保留出处

........................................................................................................................

小麦苗的微店https://weidian.com/s/793741433?wfr=c&ifr=shopdetail

小麦苗出版的数据库类丛书http://blog.itpub.net/26736162/viewspace-2142121/

小麦苗OCP、OCM、高可用网络班http://blog.itpub.net/26736162/viewspace-2148098/

小麦苗腾讯课堂主页https://lhr.ke.qq.com/

........................................................................................................................

使用 微 信客户端扫描下面的二维码来关注小麦苗的微 信公众号( xiaomaimiaolhr)及QQ群(DBA宝典)、添加小麦苗微 信, 学习最实用的数据库技术。

........................................................................................................................

欢迎与我联系

 

 



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26736162/viewspace-2656071/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
QQ:646634621| 网名:小麦苗| 微信公众号:xiaomaimiaolhr| 11g OCM| QQ群:618766405 微信群:私聊| 《数据库笔试面试宝典》作者| OCP、OCM、高可用(RAC+DG+OGG)网络班开讲啦,有需要的小伙伴可以私聊我。

注册时间:2012-09-23

  • 博文量
    1352
  • 访问量
    8138058