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

来源:这里教程网 时间:2026-03-03 16:49:02 作者:

说明 本文方法适用于使用不了命令“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)
    )
  )

相关推荐