【新特性】01.ADG的自动DML重定向增强读写分离

在使用 ADG 作为备库进行读写分离部署时,可能因为应用的原因,会有偶然的DML操作发送到备库上,在 19c 中,Oracle 支持自动重定向备库 DML,具体执行步骤为:

  1. 更新会自动重定向到主库;
  2. 主库执行更新、产生和发送Redo日志到备库;
  3. 在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可能损害主库的一致性。

 

posted @ 2021-07-15 13:23  蟹Bro  阅读(287)  评论(0编辑  收藏  举报