在前面的文章《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可能損害主庫的一致性。
這些變化告訴我們的是:時移世易,當新的版本和特性被引入時,一定會帶來新的變化,如果不能及時瞭解這些變化,在享受便利的情況下,就可能面臨意外的風險。