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