Windows 2003 + Oracle 10g RAC (10.2.0.2),客戶端間歇性連線失敗:
ERROR: ORA-12545: 因目標主機或對象不存在,連接失敗
同一 TNS 連線字串,重複執行時成功與失敗交替出現。
| 角色 | IP | 主機名 |
|---|---|---|
| Node 1 Public | 201.150.14.5 | node1 |
| Node 2 Public | 201.150.14.7 | node2 |
| Node 1 VIP | 201.150.14.18 | node1-vip |
| Node 2 VIP | 201.150.14.20 | node2-vip |
GZMDC =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 201.150.14.18)(PORT = 5880))
(ADDRESS = (PROTOCOL = TCP)(HOST = 201.150.14.20)(PORT = 5880))
)
(CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = test))
)
RAC 環境下,Listener 向遠端註冊時使用 REMOTE_LISTENER 參數指定的 TNS 名稱 (LISTENERS_TEST) 解析的 IP。若伺服器端 tnsnames.ora 中 LISTENERS_TEST 解析為 **主機名 (node1-vip)** 而非 **VIP IP**,Windows DNS 解析不穩定導致 Listener 註冊失敗,進而引發客戶端連線間歇性失敗。
SQL> SHOW PARAMETER LISTENER
NAME TYPE VALUE
local_listener string
remote_listener string LISTENERS_TEST
# 修改前 (使用主機名)
LISTENERS_TEST =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = node1-vip)(PORT = 5880))
(ADDRESS = (PROTOCOL = TCP)(HOST = node2-vip)(PORT = 5880))
)
# 修改後 (強制使用 VIP IP)
LISTENERS_TEST =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 201.150.14.18)(PORT = 5880))
(ADDRESS = (PROTOCOL = TCP)(HOST = 201.150.14.20)(PORT = 5880))
)
-- 方法一:強制 PMON 重新註冊
ALTER SYSTEM REGISTER;
-- 方法二:重啟 Listener (需 OS 層面)
lsnrctl stop LISTENER
lsnrctl start LISTENER
-- 檢查 Listener 服務註冊狀態
lsnrctl services LISTENER
-- 應顯示兩個節點 VIP IP 正確註冊
-- 客戶端連線測試 (連續 10 次)
FOR /L %I IN (1,1,10) DO sqlplus system/pwd@GZMDC
| 方案 | 優點 | 缺點 | 推薦度 |
|---|---|---|---|
| 修正伺服器端 tnsnames.ora (本文方案) | 根治、無客戶端變更、維護成本低 | 需兩節點同步修改 | ★★★★★ |
| 客戶端 hosts 檔加入 VIP 映射 | 快速驗證 | 上百台客戶端維護困難 | ★★☆☆☆ |
| DNS 確保 VIP 主機名解析正確 | 集中管理 | 依賴網路團隊、排查週期長 | ★★★☆☆ |
(FAILOVER=ON)(LOAD_BALANCE=ON)lsnrctl services 註冊狀態,異常告警