【ASK_ORACLE】手动配置DataGuard的自动化Client Failover(故障转移)的service

说明

本文方法适用于使用不了命令“SRVCTL”创建service的情况:

1. 11gR2之前的数据库版本配置DG的自动化Client Failover的service

2. 任何仅安装在文件系统上的DG,数据库版本不限


配置步骤

1. 在主库上,创建两个service,一个连接到主库(primdb),另一个(stbydb)连接到备库:

SQL> exec dbms_service.create_service('primdb','primdb'); 
SQL> exec dbms_service.create_service('stbydg','stbydg');


2. 在主库上,启动刚创建的连接到主库所需的 service

SQL> exec dbms_service.start_service('primdb');


3. 在主库上,创建触发器来自动化管理这些 services

CREATE OR REPLACE TRIGGER AutoDGServices after startup on database
DECLARE
  db_role VARCHAR(30);
  db_open_mode VARCHAR(30);
BEGIN
  SELECT DATABASE_ROLE, OPEN_MODE INTO db_role, db_open_mode FROM V$DATABASE;
  IF db_role = 'PRIMARY' THEN 
   DBMS_SERVICE.START_SERVICE('primdb'); 
   DBMS_SERVICE.STOP_SERVICE('stbydg'); 
  END IF;
  IF db_role = 'PHYSICAL STANDBY' AND db_open_mode LIKE 'READ ONLY%' THEN DBMS_SERVICE.START_SERVICE('stby_dg'); 
  END IF;
END;
/


4. 重启备库使得刚才创建的触发器生效

SQL> shu immediate
SQL> startup


5. 进行主备库切换测试,检查新的service能否自动在新主库上启动并在旧主库上停止


注:tnsnames.ora文件参考

PRIMDB =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (FAILOVER = ON)
      (LOAD_BALANCE = OFF)
      (ADDRESS = (PROTOCOL = TCP)(HOST = Prim-DB)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = Stby-DG)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = primdb)
    )
  )
  
STBYDG =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (FAILOVER = ON)
      (LOAD_BALANCE = OFF)
       (ADDRESS = (PROTOCOL = TCP)(HOST = Stby-DG)(PORT = 1521))
       (ADDRESS = (PROTOCOL = TCP)(HOST = Prim-DB)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = stbydg)
    )
  )


请使用浏览器的分享功能分享到微信等