Oracle 19c 新特性:ADG的自動DML重定向增強讀寫分離--ADG_REDIRECT_DML

lhrbest發表於2019-09-05



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 的異常.


參考:




說明

在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寶典今日頭條號地址:

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

● 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

● 文章內容來源於小麥苗的學習筆記,部分整理自網路,若有侵權或不當之處還請諒解

● 版權所有,歡迎分享本文,轉載請保留出處

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

小麥苗的微店

小麥苗出版的資料庫類叢書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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章