Oracle 19c ADG支持DML重定向到主库
5,127 total views, 10 views today
Oracle 19c 在ADG上可执行DML操作,自动重定向到主库,在主库执行DML,然后传递到ADG并应用。
该功能维护读一致性,可以看到在同一个ADG备库执行的未提交的DML操作。但是,主库及其他ADG备库必须在提交后才能看到修改的数据。
注意事项:
- 不要在ADG备库上执行太多DML操作,DML操作最终会在主库执行,影响主库性能。
- ADG不支持Oracle分布式事务。
备库开启ADG 重定向DML(ADG_REDIRECT_DML)分为system、session级别。
1 2 3 |
alter system set adg_redirect_dml=true; ALTER SESSION ENABLE ADG_REDIRECT_DML; |
开启adg_redirect_dml 后,开启的备库上执行DML操作重定向到主库写入,然后传递到从库。
测试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
SQL> conn test/test Connected. SQL> ALTER SESSION ENABLE ADG_REDIRECT_DML; Session altered. SQL> select * from t3; ID ---------- 1 SQL> insert into t3 values(2); 1 row created. SQL> select * from t3; ID ---------- 1 2 SQL> commit; Commit complete. SQL> select * from t3; ID ---------- 1 2 |
不支持sys用户在备库上执行dml操作,否则报错:
ORA-16397: statement redirection from Oracle Active Data Guard standby database to primary database failed
含有DML的pl/sql 存储过程同样可以在ADG上执行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
主库 create table employees (salary number,employee_id number); insert into employees values(1000, 1); SQL> select * from employees ; SALARY EMPLOYEE_ID ---------- ----------- 1000 1 CREATE OR REPLACE PROCEDURE update_sal (emp_id IN NUMBER,sal IN NUMBER) AS BEGIN UPDATE employees SET salary=sal WHERE employee_id=emp_id; commit; END; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
备库 SQL> ALTER SESSION ENABLE ADG_REDIRECT_DML; SQL> exec update_sal(105,6000); SQL> select * from employees; SALARY EMPLOYEE_ID ---------- ----------- 200 1 |