资料来自官方网站:

https://docs.oracle.com/en/database/oracle/oracle-database/19/sbydb/managing-oracle-data-guard-physical-standby-databases.html#GUID-B1C66720-3EA6-45A3-986E-6E510381EC79

在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的备用数据库可以查看其未提交的更改。但是,所有其他备用数据库实例只有在提交事务后才能查看这些更改。

整体的步骤如下:
1.备库的客户端发起DML操作。
2.DML操作被重定向到主库。
3.DML在主库被实施。
4.生成更改的redo传到备库。
5.完成DML重定向,客户端显示修改后的数据信息。

DML操作自动重定向到主要对象可以在系统级别或会话级别进行配置。会话级别设置将覆盖系统级别设置。要为Active Data Guard环境中的所有备用会话配置DML操作的自动重定向,请执行以下操作:

  • ADG_REDIRECT_DML初始化参数设置为TRUE

要为当前会话配置DML操作的自动重定向,请使用以下命令:

  • ALTER SESSION ENABLE ADG_REDIRECT_DML;

先决条件:

1.配置好dg_broker

2.sys用户不支持备库DML操作的自动重定向。

一.配置dg_broker

来自官方论坛:https://docs.oracle.com/cd/B28359_01/server.111/b28295/cli.htm#i1005666

我的dg最开始没有配置,所以先要配置 dg_broker。

1.1入门先决条件(参数修改)

使用DGMGRL的先决条件是主库和备库必须已经安装好,DG_BROKER_START必须TRUE为配置中的所有数据库将初始化参数设置为。

alter system set dg_broker_start=true scope=both; --主备开启dg_broker_start

1.2.主备库配置db_broker

备库上连接到主库操作

主库数据库唯一名以及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

二.Data Guard备用数据库上执行DML重定向操作

操作如下:

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可能会影响主数据库的性能。

Active Data Guard备用数据库不支持Oracle XA事务中的DML操作。
 

三.错误提示ORA-16397

 

[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.

 如果在进行DML测试的时候,提示ORA-16397,可能是:
1.主备库的连接串没有配好。
2.sys用户执行
3.备库没有进行日志应用
4.需要dg_broker进行主备的切换(我开始也是提示这个报错,但是我的配置完全正确,进行主备库的switchover to orcldg;switchover to orcl; 后 启用enable configuration就可以了)
 

四.查看DML的过程

我在备库执行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,可以把此场景用到备库主要做大量查询,偶尔进行修改的业务场景。

Oracle 19c Data Guard DML Redirection ADG备库上执行DML重定向(未来更好的进行读写分离)的更多相关文章

  1. Oracle11gr2_ADG管理之在备库上模拟failover的过程实战

    技术建议和方案. 要求failover后不重建备库,并能够把failover的数据库重新切换回备库 主库为newtest,备库为snewtest 备库上已经开启了闪回 得到一个参考的SCN SQL&g ...

  2. [置顶] Oracle 11g Data Guard Role Transitions: Failover

    Role TransitionsInvolving Physical Standby Databases A database operates in one of the following mut ...

  3. 记一次ADG备库归档目录满导致的延时处理

    报错如下,原因是存放传过来的归档的目录+HWAREDODG满了,MRP进程无法应用归档,我在手动传了几个归档之后发现不是GAP,select * from V$ARCHIVE_GAP 显示没有GAP. ...

  4. ORACLE 11.2.0.4 Single To Single Data Guard 安装 physical standby

    [root@ORACLE ~]# su - oracle [oracle@ORACLE ~]$ sqlplus / as sysdba . 查看主库归档模式: SQL> select log_m ...

  5. Oracle Data Guard 创建物理Standby数据库

    创建物理备库 机器名                    a1                    a2                    IP:                    192 ...

  6. data guard switchover切换异常

    data guard switchover切换异常 查看DG数据库备份库发现,switchover_status为SWITCHOVER LATENT SQL> select OPEN_MODE, ...

  7. 【DataGuard】部署Data Guard相关参数详解 (转载)

    原文地址:[DataGuard]部署Data Guard相关参数详解 作者:secooler    有关物理Data Guard部署参考<[DataGuard]同一台主机实现物理Data Gua ...

  8. (摘录)data guard switchover切换异常

    查看DG数据库备份库发现,switchover_status为SWITCHOVER LATENT SQL> select OPEN_MODE,PROTECTION_MODE,PROTECTION ...

  9. KingbaseES R3集群备库执行sys_backup.sh物理备份案例

    案例说明: KingbaseES R3的后期版本支持通过sys_backup.sh执行sys_rman的物理备份,实际上是调用了sys_rman_v6的工具做物理备份.本案例是在备库上执行集群的备份, ...

随机推荐

  1. 如何取消一个 Ajax 请求

    如何取消一个 Ajax 请求 jQuery XMLHttpRequest.abort() https://stackoverflow.com/questions/446594/abort-ajax-r ...

  2. 画一个PBN大角度飞越转弯保护区

      今天出太阳了,尽管街上的行人依旧很少,但心情开始不那么沉闷了.朋友圈里除了关注疫情的最新变化之外,很多人已经开始选择读书或是和家人一起渡过这个最漫长的春节假期.陕西广电网络春节期间所有点播节目一律 ...

  3. Python算法_斐波那契数列(10)

    写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项.斐波那契数列的定义如下: F(0) = 0,   F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 ...

  4. JS广度优先遍历

    自己用JS实现了 广度优先遍历 第一种用了数组的高阶函数,看起来有些复杂.然后思索着从可读性上优化了一下,孰优孰劣以后分析. var list = [{ id: "ab", chi ...

  5. Vue(1)

    一:概述 Vue是一套用于构建用户界面的渐进式JavaScript框架,与其它大型框架不同的是,Vue被设计为可以自底向上逐层应用.Vue的核心库只关心视图层,不仅易于上手,还便于与第三方库或既有项目 ...

  6. 微信小程序(六)-项目实例(原生框架 MINA基配搭建)==01-头搜索框tabbar

    项目实例(原生框架 MINA) 1.新建小程序项目 1.用自已的小程序APPID 2.清除整理项目中初建默认无关的代码 1.app.json 中删除logs,同时删除pages下的losgs文件夹 2 ...

  7. Django的视图层和模板层

    目录 一.视图层 1. 小白必会三板斧 2. JsonResponse 3. FBV与CBV 3.1 FVB 3.2 CBV 4. CBV的源码 5. 给CBV加装饰器 二.模板层 1. 模板语法 2 ...

  8. 查看手机CPU每个APP利用率

    adb   shell   top   -m   5

  9. 弹性盒布局详解(display: flex;)

    弹性盒布局详解 弹性盒介绍 弹性盒的CSS属性 开启弹性盒 弹性容器的CSS属性 flex-direction设置弹性元素在弹性容器中的排列方向 主轴与侧轴(副轴) flex-wrap设置弹性容器空间 ...

  10. 后端程序员之路 37、Akka、Actor、Scala初窥

    Akkahttp://akka.io/ Akka 是一个用 Scala 编写的库,用于简化编写容错的.高可伸缩性的 Java 和 Scala 的 Actor 模型应用,是一个广泛运用的分布式应用框架. ...