配置Data Guard 客户端的failover

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xxzhaobb/article/details/82623134

参考文档: How To Configure Client Failover For Data Guard Connections Using Database Services (文档 ID 1429223.1)

其实,是没有测试成功,手头上的环境是Windows平台的12.2.0.1 。Dataguard安装在一台主机上,有些问题。暂把测试记录下来。有环境了再测试。

-- 11GR2之前的配置

-- 在当前的主库上,创建两个services,一个连接到主库,一个连接到备库。

SQL> exec dbms_service.create_service('prim_db','prim_db');     -- 其中一个是service_name,一个是network_name
SQL> exec dbms_service.create_service('stby_db','stby_db');     -- 注意要在服务端配置netowrk_name 

-- 在当前主库,启动service

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

-- 查看监听器的状态

服务摘要..
服务 "CLRExtProc" 包含 1 个实例。
  实例 "CLRExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
服务 "nocdb" 包含 2 个实例。
  实例 "nocdb", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
  实例 "nocdb", 状态 READY, 包含此服务的 1 个处理程序...
服务 "nocdbXDB" 包含 1 个实例。
  实例 "nocdb", 状态 READY, 包含此服务的 1 个处理程序...
服务 "nocdb_stdby" 包含 1 个实例。
  实例 "nocdb_stdby", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
服务 "orcl" 包含 1 个实例。
  实例 "orcl", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
服务 "orcl_stdby" 包含 1 个实例。
  实例 "orcl_stdby", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
服务 "prim_db" 包含 1 个实例。
  实例 "nocdb", 状态 READY, 包含此服务的 1 个处理程序...
命令执行成功
LSNRCTL>

-- 在当前主库,创建触发器,管理这些services

CREATE OR REPLACE TRIGGER startDgServices 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('prim_db'); END IF;
  IF db_role = 'PHYSICAL STANDBY' AND db_open_mode LIKE 'READ ONLY%' THEN DBMS_SERVICE.START_SERVICE('stby_db'); END IF;
END;
/

-- 配置客户端的tnsnames

PRIM_DB =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (FAILOVER = ON)
      (LOAD_BALANCE = OFF)
      (ADDRESS = (PROTOCOL = TCP)(HOST = primary.oracle.com)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = standby.oracle.com)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = prim_db)
    )
  )
  
STBY_DB =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (FAILOVER = ON)
      (LOAD_BALANCE = OFF)
      (ADDRESS = (PROTOCOL = TCP)(HOST = primary.oracle.com)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = standby.oracle.com)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = stby_db)
    )
  )  
  

11gR2 和之后版本的配置方法

-- 在主库和备库上创建主库服务

On primary:
[oracle@vmOraLinux6 ~]$ srvctl add service -d ora11gR2 -s prim_db -l PRIMARY -e SESSION -m BASIC -w 10 -z 10
On standby:
[oracle@vmOraLinux6 ~]$ srvctl add service -d sby11gR2 -s prim_db -l PRIMARY -e SESSION -m BASIC -w 10 -z 10

-- 启动创建的服务

[oracle@vmOraLinux6 admin]$ srvctl start service -d ora11gR2 -s prim_db

-- 在主库和备库上创建备库服务

On primary:
[oracle@vmOraLinux6 ~]$ srvctl add service -d ora11gR2 -s stby_db -l PHYSICAL_STANDBY -e SESSION -m BASIC -w 10 -z 10
On standby:
[oracle@vmOraLinux6 ~]$ srvctl add service -d sby11gR2 -s stby_db -l PHYSICAL_STANDBY -e SESSION -m BASIC -w 10 -z 10

-- 启动创建的服务

[oracle@vmOraLinux6 ~]$ srvctl start service -d sby11gR2 -s stby_db

-- 创建客户端的tnsnames

PRIM_DB =
  (DESCRIPTION =
     (ADDRESS_LIST =
       (FAILOVER = ON)
       (LOAD_BALANCE = OFF)
       (ADDRESS = (PROTOCOL = TCP)(HOST = primary.oracle.com)(PORT = 1521))
       (ADDRESS = (PROTOCOL = TCP)(HOST = standby.oracle.com)(PORT = 1521))
     )
     (CONNECT_DATA =
       (SERVICE_NAME = prim_db)
     )
  )

STBY_DB =
  (DESCRIPTION =
     (ADDRESS_LIST =
       (FAILOVER = ON)
       (LOAD_BALANCE = OFF)
       (ADDRESS = (PROTOCOL = TCP)(HOST = primary.oracle.com)(PORT = 1521))
       (ADDRESS = (PROTOCOL = TCP)(HOST = standby.oracle.com)(PORT = 1521))
     )
    (CONNECT_DATA =
       (SERVICE_NAME = stby_db)
    )
  )

END

猜你喜欢

转载自blog.csdn.net/xxzhaobb/article/details/82623134