參考文檔: 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