連線 Oracle 時頻繁遇到「Invalid URL」「ORA-12154」「ORA-12541」,根因多為實例名/服務名/連接埠不匹配。本文提供三種查詢實例名與服務名的標準方法,並解析三大設定檔關係。
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl) <-- 服務名 (對外發布)
(ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
(SID_NAME = orcl) <-- 實例名 (SID)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = db-server)(PORT = 1521))
)
)
instance_name 參數)ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = db-server)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl) <-- 必須與 Listener GLOBAL_DBNAME 一致
)
)
Client 以 ORCL (TNS 別名) 連線,實際解析至 SERVICE_NAME=orcl。
-- 1. 服務名 (參數 service_names,可多值)
SHOW PARAMETER service_names;
-- 或
SELECT value FROM v$parameter WHERE name = 'service_names';
-- 2. 實例名 (參數 instance_name)
SHOW PARAMETER instance_name;
-- 3. 資料庫唯一名 (DB_UNIQUE_NAME,Data Guard 環境關鍵)
SHOW PARAMETER db_unique_name;
-- 4. 綜合視圖
SELECT instance_name, host_name, version, startup_time, status
FROM v$instance;
SELECT name, db_unique_name, log_mode, open_mode
FROM v$database;
| 名稱 | 參數/來源 | 用途 | 範例 |
|---|---|---|---|
| SID / Instance Name | instance_name / ORACLE_SID | 作業系統層級識別執行個體,共享記憶體區段鍵值 | orcl |
| Service Name | service_names (可多值) | 網路層級邏輯服務識別,Client 連線、負載平衡、Failover 依據 | orcl, orcl_pdb1, sales.example.com |
| DB Name | db_name | 資料庫建立時指定,控制檔/資料檔標識,不可變 | ORCL |
| DB Unique Name | db_unique_name | Data Guard 環境區分 Primary/Standby | ORCL_PRIMARY, ORCL_STBY |
| Global Database Name | db_name.db_domain | 網域完整名稱,Enterprise Manager/註冊用 | orcl.example.com |
| 錯誤 | 可能原因 | 檢查重點 |
|---|---|---|
| ORA-12154: TNS:could not resolve the connect identifier specified | tnsnames.ora 找不到別名、格式錯誤、TNS_ADMIN 未設定 | tnsnames.ora 內容、tnsping alias、環境變數 TNS_ADMIN |
| ORA-12541: TNS:no listener | Listener 未啟動、埠錯誤、防火牆阻擋 | lsnrctl status、netstat -an | grep 1521、防火牆規則 |
| ORA-12514: TNS:listener does not currently know of service requested in connect descriptor | SERVICE_NAME 與 Listener 註冊的 GLOBAL_DBNAME 不符、服務未動態註冊 | lsnrctl services 檢視已註冊服務、service_names 參數 |
| ORA-12505: TNS:listener does not currently know of SID given in connect descriptor | 用 SID 連線但 Listener 未註冊該 SID (靜態註冊缺失) | listener.ora SID_LIST 設定、動態註冊狀態 |
# Client 端
tnsping ORCL # 驗證 TNS 解析與 Listener 連通性
sqlplus user/pwd@ORCL # 實際連線測試
# Server 端
lsnrctl status # Listener 狀態、監聽埠、已註冊服務
lsnrctl services # 詳細服務/實例/處理程序狀態 (READY/BLOCKED)
掌握「SID ≠ Service Name ≠ DB Name」,並能在 Listener.ora、Tnsnames.ora、資料庫參數三處交叉驗證,即可解決 95% 的連線識別問題。