`listener.ora`、`tnsnames.ora` 格式敏感且易出錯,建議建立標準範本備份,部署時複製修改。Linux 環境下 `sqlnet.ora` 常導致問題,可直接刪除或重命名。Windows 下 Listener 服務啟動失敗,可直接執行 `$ORACLE_HOME/bin/lsnrctl.exe` 保持視窗開啟作為臨時解法。
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1521))
)
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = database1) # 資料庫 Instance 名稱
(ORACLE_HOME = /opt/oracle/product/10.1.0) # 安裝路徑,依實際調整
(PROGRAM = extproc)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1521))
)
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = database1)
(ORACLE_HOME = /opt/oracle/product/10.1.0)
(PROGRAM = extproc)
)
(SID_DESC =
(SID_NAME = database2) # 第二個 Instance 名稱
(ORACLE_HOME = /opt/oracle/product/10.1.0)
(PROGRAM = extproc)
)
)
lsnrctl start # 啟動
lsnrctl stop # 停止
lsnrctl status # 查看狀態 (含服務註冊狀態)
lsnrctl services # 詳細服務/處理程序資訊
lsnrctl reload # 重載配置 (無需重啟)
ORALOCAL = # 連線別名
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = database1) # 服務名 / SID
# (SID = database1) # 10g 以前用 SID,11g+ 建議 SERVICE_NAME
)
)
tnsping ORALOCAL # 測試別名解析與連通性
sqlplus user/pwd@ORALOCAL # 實際連線測試
| 錯誤/現象 | 可能原因 | 排查步驟 |
|---|---|---|
| ORA-12514: Listener does not currently know of service requested | SERVICE_NAME/SID 拼寫錯誤、Instance 未向 Listener 註冊 | 1. `lsnrctl services` 確認已註冊服務名 2. 檢查 `local_listener` 參數 3. `ALTER SYSTEM REGISTER;` 強制註冊 |
| ORA-12541: TNS:no listener | Listener 未啟動、埠號錯誤、防火牆阻擋 | 1. `lsnrctl status` 確認運行 2. `netstat -an | grep 1521` 確認埠監聽 3. 防火牆開放 1521 |
| ORA-12154: TNS:could not resolve the connect identifier | TNSNAMES.ORA 路徑錯誤、別名拼寫錯誤、TNS_ADMIN 環境變數未設 | 1. 確認 `tnsping 別名` 失敗 2. 檢查 `TNS_ADMIN` 指向正確目錄 3. 使用絕對路徑測試 |
| Linux: 連線閒置中斷 | `sqlnet.ora` 參數 `SQLNET.EXPIRE_TIME` / 防火牆閒置超時 | 1. 設定 `SQLNET.EXPIRE_TIME=10` (分鐘) 2. 調整防火牆/負載平衡器閒置逾時 |
| Windows: 服務啟動失敗 | 權限不足、路徑含空格、多 Oracle Home 衝突 | 1. 以管理員身份執行 `lsnrctl.exe` 2. 檢查 `ORACLE_HOME` 環境變數 3. 使用 `ORACLE_HOME\bin\lsnrctl` 完整路徑 |