zoukankan      html  css  js  c++  java
  • Oracle 19c Data Guard DML Redirection ADG备库上执行DML重定向(未来更好的进行读写分离)

    资料来自官方网站:

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

  • 相关阅读:
    OC学习一周总结
    C语言基础学习总结
    123
    汇编中中括号[]作用以及lea和mov指令的区别
    C#获取局域网内所有的SQL Server服务器名
    .net 初中级程序员招聘
    C#在客户端与 JS 交互
    [ZT]Mac下安装mysql和workbench
    Eclipse文件夹导入Jar
    Tomcat配置后提示404的解决办法
  • 原文地址:https://www.cnblogs.com/hmwh/p/14598827.html
Copyright © 2011-2022 走看看