Oracle 10g Dataguard Broker Failover切换与HA

主库上都创建一个名为'PROD_TAF'的服务:
exec dbms_service.create_service(service_name=>'PROD_TAF',network_name=>'PROD_TAF');

SQL> exec dbms_service.create_service(service_name=>'PROD_TAF',network_name=>'PROD_TAF');
PL/SQL procedure successfully completed.

主从库上都创建一个触发器,当数据库启动到primary状态,启动上述的服务:
CREATE OR REPLACE TRIGGER trg_taf_service
after startup on database
DECLARE
role VARCHAR(30);
BEGIN
SELECT DATABASE_ROLE INTO role FROM V$DATABASE;
IF role='PRIMARY' THEN
DBMS_SERVICE.START_SERVICE('PROD_TAF');
END IF;
END;
/

SQL> CREATE OR REPLACE TRIGGER trg_taf_service
  2  after startup on database
  3  DECLARE
  4  role VARCHAR(30);
  5  BEGIN
  6  SELECT DATABASE_ROLE INTO role FROM V$DATABASE;
  7  IF role='PRIMARY' THEN
  8  DBMS_SERVICE.START_SERVICE('PROD_TAF');
  9  END IF;
10  END;
11  /

Trigger created.

当该服务没有启动时,启动'PROD_TAF'服务:
exec dbms_service.start_service(service_name=>'PROD_TAF');


查看动'PROD_TAF'服务是否启动:
lsnrctl service|grep PROD_TAF

$ lsnrctl service|grep PROD_TAF
Service "PROD_TAF" has 1 instance(s).

客户端tnsnames配置:
PROD_TAF =
 (DESCRIPTION =
   (ADDRESS = (PROTOCOL = TCP)(HOST = xxxpri)(PORT = 1521))
   (ADDRESS = (PROTOCOL = TCP)(HOST = xxxxstdby)(PORT = 1521))
   (LOAD_BALANCE = off)
   (FAILOVER = ON)
   (CONNECT_DATA =
     (SERVICE_NAME = PROD_TAF)
     (failover_mode =
       (type = select)
       (method = basic)
       (retries = 20)
       (delay = 15)
     )
   )
 )


这样无论切换到那一台机器上,对客户端都是透明的,客户端程序与配置不用做任何改动。

猜你喜欢

转载自wwtang9527.iteye.com/blog/1607927