资料来自官方网站:html
https://docs.oracle.com/en/database/oracle/oracle-database/19/sbydb/managing-oracle-data-guard-physical-standby-databases.html#GUID-B1C66720-3EA6-45A3-986E-6E510381EC79sql
在19c以前,oracle Data Guard备用数据库上不能执行DML操做,可是,从19c开始备库就能够进行DML操做了;我的以为象征意思确实很大,至关于将来的oracle是更智能,高效,高可用,甚至是更好的读写分离。数据库
Active Data Guard备用数据库上运行DML操做,能够在备用数据库上运行只读应用程序,偶尔执行DML(太频繁影响主库性能),备库上的DML操做能够透明地重定向到主数据库并在主数据库上运行。也包括PL/SQL块中的DML语句。Active Data Guard会话将等待,直到将相应的更改发送到Active Data Guard备用数据库并将其应用于Active Data Guard备用数据库为止。在DML操做期间将保持读取一致性,而且运行DML的备用数据库能够查看其未提交的更改。可是,全部其余备用数据库实例只有在提交事务后才能查看这些更改。session
总体的步骤以下:
1.备库的客户端发起DML操做。
2.DML操做被重定向到主库。
3.DML在主库被实施。
4.生成更改的redo传到备库。
5.完成DML重定向,客户端显示修改后的数据信息。oracle
DML操做自动重定向到主要对象能够在系统级别或会话级别进行配置。会话级别设置将覆盖系统级别设置。要为Active Data Guard环境中的全部备用会话配置DML操做的自动重定向,请执行如下操做:性能
ADG_REDIRECT_DML
初始化参数设置为TRUE
。要为当前会话配置DML操做的自动重定向,请使用如下命令:测试
ALTER SESSION ENABLE ADG_REDIRECT_DML;
先决条件:网站
1.配置好dg_brokerspa
2.sys用户不支持备库DML操做的自动重定向。3d
来自官方文档:https://docs.oracle.com/cd/B28359_01/server.111/b28295/cli.htm#i1005666
个人dg最开始没有配置,因此先要配置 dg_broker。
使用DGMGRL的先决条件是主库和备库必须已经安装好,DG_BROKER_START
必须TRUE
为配置中的全部数据库将初始化参数设置为。
alter system set dg_broker_start=true scope=both; --主备开启dg_broker_start
备库上链接到主库操做
主库数据库惟一名以及tns链接串名都是:orcl
备库数据库惟一名以及tns链接串名都是:orcldg
dg_broker 配置 orcl_brk_config
dgmgrl
connect sys/密码@orcl
--把主库添加到dg_broker,备库上链接到主库操做
备库执行:
alter system set log_archive_dest_2=''; --备库我关闭了log_archive_dest_2因为服务名字符串同样。
CREATE CONFIGURATION 'orcl_brk_config' AS PRIMARY DATABASE IS 'orcl' CONNECT IDENTIFIER IS orcl;
show CONFIGURATION
--把备库添加到dg_broker,仍然是链接到备库上
ADD DATABASE orcldg AS CONNECT IDENTIFIER IS orcldg MAINTAINED AS PHYSICAL;
启用
show configuration;
ENABLE CONFIGURATION;
show database orcl;
show database orcldg
操做以下:
select database_role from v$database;
show parameter ADG_REDIRECT_DML;
alter system set adg_redirect_dml=true scope=both;
重启备库
select database_role from v$database;
select open_mode from v$database;
show parameter ADG_REDIRECT_DML;
ALTER SESSION ENABLE ADG_REDIRECT_DML;
insert into dg_test select rownum from dual connect by rownum <=100;
在测试当主,我测试了sys用户不支持备库DML操做的自动重定向。
select database_role from v$database;
select open_mode from v$database;
show parameter ADG_REDIRECT_DML;
ALTER SESSION ENABLE ADG_REDIRECT_DML;
insert into test select rownum from dual connect by rownum <=100;
结论:
避免在Active Data Guard备用数据库上也运行DML操做。由于操做其实是在主数据库上执行的,因此太多的DML可能会影响主数据库的性能。
[oracle@19cdg ~]$ oerr ora 16397
16397, 00000, "statement redirection from Oracle Active Data Guard standby database to primary database failed"
// *Cause: The statement redirection failed because of one of the following reasons:
// 1. The primary database connect string was not established.
// 2. The primary database could not be reached.
// 3. The undo-mode or incarnation were not the same.
// 4. The current user and logged-in user were not the same.
// 5. Redirecting CREATE TABLE AS SELECT (CTAS) of the global temporary
// table was not supported.
// 6. Redirecting PL/SQL execution having bind variable was not supported.
// *Action: Run the statement after fixing the condition that caused the failure.
我在备库执行update 语句,可是不提交,查看整个会话过程。
能够作个10046 trace看看,我是直接进行会话查询。
sqlplus racttfc/oracle@orcldg
show user;
select database_role from v$database;
select open_mode from v$database;
ALTER SESSION ENABLE ADG_REDIRECT_DML;
update dg_test set id=1 where id>50;
SELECT username, final_blocking_session, final_blocking_instance, event lockwait, status, machine, service_name , sql_id FROM gv$session WHERE username IS NOT NULL;
insert into dg_test select rownum from dual connect by rownum <=100000;
commit;
update dg_test set id=1 where id>50;
select sql_text from v$sql where sql_id in ('8xn0mav2kq662','0f35avqs2973b');
整个备库执行DML语句都是被重定向到主库,DML在主库被实施,而后再返回备库,可是要是备库执行大量的DML语句,确定会影响到主库的性能,因此只适合适量的dml,能够把此场景用到备库主要作大量查询,偶尔进行修改的业务场景。