版权声明:本文为博主原创文章,未经博主允许不得转载。 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