【新特性】01.ADG的自动DML重定向增强读写分离
在使用 ADG 作为备库进行读写分离部署时,可能因为应用的原因,会有偶然的DML操作发送到备库上,在 19c 中,Oracle 支持自动重定向备库 DML,具体执行步骤为:
- 更新会自动重定向到主库;
- 主库执行更新、产生和发送Redo日志到备库;
- 在Redo备库应用后,ADG会话会透明的看到更新信息的落地实施;
这一特性可以通过在系统级或者会话级设置参数 ADG_REDIRECT_DML 参数启用,通过这种方式,ADG 会话的 ACID 一致性得以保持,同时透明的支持『多数读,偶尔更新』应用的自然读写分离配置。
主库:
SQL> create user c##adg_test identified by adg_test;
User created.
SQL> grant connect,resource,dba to c##adg_test;
Grant succeeded.
SQL> connect c##adg_test/adg_test;
Connected.
SQL> create table test(id number,name varchar2(20));
Table created.
SQL> insert into test values(1,'test');
1 row created.
SQL> commit;
Commit complete.
SQL> select open_mode from v$database;
OPEN_MODE
--------------------
READ WRITE
备库:
[oracle@T2 ~]$ sqlplus c##adg_test/adg_test SQL*Plus: Release 19.0.0.0.0 - Production on Thu Jul 15 10:10:14 2021 Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle. All rights reserved. Last Successful login time: Thu Jul 15 2021 10:02:01 +08:00 Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0 SQL> select open_mode from v$database; OPEN_MODE -------------------- READ ONLY WITH APPLY SQL> select * from test; ID NAME ---------- -------------------- 1 test SQL> alter system set ADG_REDIRECT_DML=TRUE; System altered. SQL> show parameter ADG_REDIRECT_DML NAME TYPE VALUE ------------------ ----------- ------------------------------ adg_redirect_dml boolean TRUE --此处启用跟踪,可以分析 ADG 重定向的工作原理 SQL> alter session set events '10046 trace name context forever ,level 12'; Session altered. SQL> insert into test values(2,'test2'); 1 row created. SQL> commit; Commit complete. SQL> select * from test; ID NAME ---------- ----------------------------- 1 test 2 test2
在以上测试中,可以通过设置10046跟踪,以获得后台的递归执行,研究这个特性的工作原理。
通过后台的跟踪日志,可以看到,DML操作是通过DB Link来重定向到主库执行的,这个DB Link是内部的,在服务名等配置正常情况下,Oracle能够自动完成内部操作,如果配置错误则会出现错误:
===================== PARSING IN CURSOR #140611330452344 len=34 dep=0 uid=106 oct=2 lid=106 tim=612113881944 hv=1288217481 ad='70ffe278' sqlid='dbxctxt6cj8w9' insert into test values(2,'test2') END OF STMT PARSE #140611330452344:c=907,e=1866,p=0,cr=0,cu=1,mis=1,r=0,dep=0,og=1,plh=0,tim=612113881943 WAIT #140611330452344: nam='SQL*Net message to dblink' ela= 1 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=612113882076 WAIT #140611330452344: nam='SQL*Net message from dblink' ela= 404 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=612113882495 EXEC #140611330452344:c=493,e=493,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=1,plh=0,tim=612113882526 WAIT #140611330452344: nam='SQL*Net message to dblink' ela= 1 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=612113882582 WAIT #140611330452344: nam='SQL*Net vector data to dblink' ela= 71 driver id=1413697536 #bytes=26 p3=2 obj#=-1 tim=612113882667 WAIT #140611330452344: nam='SQL*Net message from dblink' ela= 361 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=612113883063 WAIT #140611330452344: nam='standby query scn advance' ela= 654218 p1=3644821 p2=0 p3=12000 obj#=-1 tim=612114537303 WAIT #140611330452344: nam='SQL*Net message to client' ela= 2 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=612114537404
除了常规表之外,Oracle 还支持在备库创建全局临时表,在19c中,隐含参数 _alter_adg_redirect_behavior 可以用于定义允许重定向的级别,例如当设置 disallow_gtt 将不允许重定向全局临时表。
ADG 中 DML 重定向新特性带来的另外一个问题时,以后部署ADG时,必须注意备库安全管控,否则滥发到备库的DML可能损害主库的一致性。