歡迎光臨
每天分享高質量文章

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

在前面的文章《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可能損害主庫的一致性。

 

這些變化告訴我們的是:時移世易,當新的版本和特性被引入時,一定會帶來新的變化,如果不能及時瞭解這些變化,在享受便利的情況下,就可能面臨意外的風險

    贊(0)

    分享創造快樂