實務上常遇到:開發、測試、生產環境資料庫 **SID/Service Name 完全相同**(如皆為 ORCL),但部署在不同 IP 主機上。PL/SQL Developer 連線視窗僅顯示「資料庫」下拉選單,無法直接區分同名實例。本文揭示核心機制:**TNS 別名才是連線真實識別符**,並示範如何透過 tnsnames.ora 管理多環境連線。
PL/SQL Developer 登入視窗中,「資料庫」下拉選單顯示的正是 tnsnames.ora 定義的 **別名**,而非實際 SID。若多環境使用相同 SID 但未在 tnsnames.ora 設定差異化別名,將只看到重複的 ORCL,無法分辨。
1. 使用者在 PL/SQL Developer 選擇「資料庫」別名(如 DEV_ORCL)
2. 客戶端讀取 $ORACLE_HOME/network/admin/tnsnames.ora
3. 找到 DEV_ORCL 對應的連線描述符:
DEV_ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL=TCP)(HOST=192.168.1.10)(PORT=1521))
(CONNECT_DATA = (SERVICE_NAME=ORCL)))
4. 透過 TCP 連線至 192.168.1.10:1521,請求 SERVICE_NAME=ORCL
5. 監聽器驗證服務存在,建立 Session
結論:**別名 = 連線入口,SID/Service Name = 目標服務標識**。同一 SID 可對應無數個別名,指向不同主機/埠口。
| 環境 | 別名格式 | 範例 | HOST IP |
|---|---|---|---|
| 開發 | {ENV}_{SID} | DEV_ORCL | 192.168.10.20 |
| 測試 | {ENV}_{SID} | TEST_ORCL | 192.168.20.30 |
| 預演 | {ENV}_{SID} | STAGE_ORCL | 192.168.30.40 |
| 生產 | {ENV}_{SID} | PROD_ORCL | 10.0.1.100 |
# $ORACLE_HOME/network/admin/tnsnames.ora
# 或用戶目錄 %APPDATA%\Oracle\tnsnames.ora (Windows)
DEV_ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.20)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCL)
)
)
TEST_ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.20.30)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCL)
)
)
PROD_ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.1.100)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.1.101)(PORT = 1521)) -- RAC 多節點
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCL)
(FAILOVER_MODE = (TYPE = SELECT)(METHOD = BASIC)(RETRIES = 180)(DELAY = 5))
)
)
Tools → Preferences → Connection 確認 Oracle Home 指向正確客戶端目錄F4)tnsnames.ora 檔案(建議),存檔後 PL/SQL Developer 自動重整列表DEV_ORCL、輸入對應環境帳號密碼 → 連線APP_ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(LOAD_BALANCE = ON) -- 或 FAILOVER = ON
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.10)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.11)(PORT = 1521))
)
(CONNECT_DATA = (SERVICE_NAME = ORCL))
)
LOAD_BALANCE = ON:客戶端隨機選擇節點分散負載FAILOVER = ON:首選第一節點,失敗自動嘗試下一節點CONNECT_DATA.FAILOVER_MODE 實現 SELECT 語句級故障轉移(TAF)| 現象 | 可能原因 | 解決方案 |
|---|---|---|
| 下拉選單無別名 | tnsnames.ora 路徑錯誤/語法錯誤/權限不足 | 檢查 Preferences → Oracle Home;用筆記本開啟 tnsnames.ora 驗證括號配對 |
| ORA-12154: TNS:could not resolve | 別名拼寫錯誤/tnsnames.ora 未生效 | 重啟 PL/SQL Developer;tnsping 別名 驗證解析 |
| ORA-12514: Listener does not know service | SERVICE_NAME 拼寫錯誤/目標資料庫未註冊該服務 | 目標主機執行 lsnrctl services 確認服務名 |
| 連上錯誤環境 | 別名指向錯誤 IP | 嚴格執行命名規範;連線後執行 SELECT SYS_CONTEXT('USERENV','SERVER_HOST') FROM DUAL 驗證 |
tnsnames.ora 納入專案 Git 儲存庫(config/tnsnames.ora)cp config/tnsnames.ora %APPDATA%\Oracle\ 一鍵配置