Oracle 19C Active Data Guard DML Redirection

来源:这里教程网 时间:2026-03-03 21:40:32 作者:

环境准备

主库PRIMARY_DB(主机: primary_host,服务名: primary_svc)

  • 备库STANDBY_DB(主机: standby_host,服务名: standby_svc)

  • Oracle 19C ADG需要提前搭建同时处于正常同步状态,搭建过程不做展示。

    步骤1:在主库和备库上配置服务

    通过 DBMS_SERVICE包创建专用服务,用于DML重定向。

            在主库执行:

    BEGIN
      DBMS_SERVICE.CREATE_SERVICE(
        service_name => 'dml_redirect_svc',
        network_name => 'dml_redirect_svc',
        aq_ha_notifications => TRUE,
        failover_method => 'BASIC',
        failover_type => 'TRANSACTION',
        failover_retries => 5,
        failover_delay => 5
      );
    END;
    /

            在备库执行:

    BEGIN
      DBMS_SERVICE.CREATE_SERVICE(
        service_name => 'dml_redirect_svc',
        network_name => 'dml_redirect_svc',
        aq_ha_notifications => TRUE,
        failover_method => 'BASIC',
        failover_type => 'TRANSACTION',
        failover_retries => 5,
        failover_delay => 5
      );
    END;
    /

    步骤2:配置客户端TNS别名

    在客户端的 tnsnames.ora中添加以下条目,配置故障转移逻辑:

    DML_REDIRECT =
      (DESCRIPTION =
        (ADDRESS_LIST =
          (LOAD_BALANCE = ON)
          (ADDRESS = (PROTOCOL = TCP)(HOST = standby_host)(PORT = 1521))
          (ADDRESS = (PROTOCOL = TCP)(HOST = primary_host)(PORT = 1521))
        )
        (CONNECT_DATA =
          (SERVICE_NAME = dml_redirect_svc)
          (FAILOVER_MODE =
            (TYPE = SELECT)       # 故障转移类型为SELECT(会话级)
            (METHOD = BASIC)      # 基本故障转移方法
            (RETRIES = 180)       # 最多重试180次
            (DELAY = 5)           # 每次重试间隔5秒
          )
        )
      )

    步骤3:验证服务状态

    在主库和备库上启动服务并检查状态:

    -- 在主库启动服务
    ALTER SYSTEM SET SERVICE_NAMES='primary_svc,dml_redirect_svc';
    -- 在备库启动服务
    ALTER SYSTEM SET SERVICE_NAMES='standby_svc,dml_redirect_svc';

    使用以下命令检查服务注册状态:

    SELECT INST_ID, NAME, NETWORK_NAME, GOAL, CLB_GOAL, ENABLED 
    FROM GV$SERVICES 
    WHERE NAME = 'dml_redirect_svc';

    步骤4:测试DML重定向

    1. 应用连接测试

    sqlplus user/password@DML_REDIRECT

    默认优先连接到备库( standby_host)。

    2.执行SELECT操作

    SELECT * FROM test_table;

    确认查询结果来自备库。

    3. 执行DML操作

    INSERT INTO test_table VALUES (1, 'test');

    备库因只读会抛出错误  ORA-16000: 数据库以只读模式打开。

  • 客户端根据 FAILOVER_MODE自动重试连接到主库,DML在主库成功执行。

    4.验证数据同步

    主库提交后,ADG自动同步数据到备库。

  • 在备库执行查询,确认数据已同步。

  • 相关推荐