三大配置檔角色定位
| 檔案 | 位置 | 角色 | 類比 |
SQLNET.ORA | $ORACLE_HOME/NETWORK/ADMIN | 名稱解析策略 (先查 TNS、再查 LDAP、再查 Hostname) | /etc/nsswitch.conf |
TNSNAMES.ORA | 同左 | 服務名 → 連線描述映射表 | /etc/hosts |
LISTENER.ORA | 同左 (伺服器端) | 監聽器進程配置:監聽端口、服務註冊、SID_LIST | inetd.conf |
連線流程完整追蹤
- 客戶端執行
SQLPLUS USER/PASS@ORCL
- 讀取
SQLNET.ORA → NAMES.DIRECTORY_PATH=(TNSNAMES, HOSTNAME)
- 優先查
TNSNAMES.ORA 找 ORCL 記錄 → 取得 HOST、PORT、SERVICE_NAME
- TCP 連接 Listener (Port 1521)
- Listener 依
SERVICE_NAME 或 SID 尋找對應服務處理程序
- 專用伺服器模式:Listener 啟動新 Server Process,回傳重導向端口,Client 直連
- 共享伺服器模式:Listener 導向 Dispatcher,Client 連 Dispatcher
- 連線建立完成,Listener 任務結束,後續通訊不經 Listener
配置檔標準範本
SQLNET.ORA
SQLNET.AUTHENTICATION_SERVICES = (NTS)
NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)
# EZCONNECT 允許 user/pass@host:port/service 直連,無需 TNSNAMES
SQLNET.EXPIRE_TIME = 10 # 檢測死連線 (分鐘)
SQLNET.INBOUND_CONNECT_TIMEOUT = 60
TNSNAMES.ORA
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCL)
)
)
SALES =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = SALES-SRV)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = SALES)
)
)
LISTENER.ORA (伺服器端)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ORCL)
(ORACLE_HOME = /U01/APP/ORACLE/PRODUCT/11.2.0/DBHOME_1)
(SID_NAME = ORCL)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
# 關鍵:ADMIN_RESTRICTIONS_LISTENER=ON 防止遠程 LSNRCTL 停止監聽
# SUBSCRIBE_FOR_NODE_DOWN_EVENT_LISTENER=ON 支援 RAC 節點故障快速轉移
三大診斷指令
| 指令 | 用途 | 範例輸出關鍵字 |
LSNRCTL STATUS | 檢視監聽狀態、已註冊服務 | Service "ORCL" has 1 instance(s), Instance "ORCL", status READY |
TNSPING ORCL | 驗證客戶端解析路徑、Listener 連通性 | OK (20 msec), Used TNSNAMES adapter |
SQLPLUS / AS SYSDBA → SHOW SGA | 確認 Instance 已啟動 | Total System Global Area 102020364 bytes |
Hostname 直連模式 (免 TNSNAMES)
- Listener.ora 設定
GLOBAL_DBNAME 並確保 HOST 可解析
- SQLNET.ORA 設定
NAMES.DIRECTORY_PATH=(HOSTNAME)
- Client 直連:
SQLPLUS USER/PASS@DBHOST
適合大量 Client、IP 固定、DNS 完善的環境,避免分發 TNSNAMES.ORA 維護成本。
常見錯誤代碼速查
| 錯誤 | 原因 | 解決 |
| ORA-12154 | TNS 解析失敗 | 檢查 TNSNAMES.ORA 拼寫、SQLNET.ORA 解析順序 |
| ORA-12514 | Listener 無此服務 | 檢查 SERVICE_NAME/SID、Listener 註冊狀態 |
| ORA-12541 | 無監聽程序 | 啟動 Listener、檢查防火牆 1521 |
| ORA-12545 | 目標主機/端口錯誤 | TNSNAMES HOST/PORT 拼寫、網路不通 |
| ORA-12170 | 連線逾時 | 防火牆、SQLNET.INBOUND_CONNECT_TIMEOUT、Listener 過載 |
本地連線不經 Listener
SQLPLUS / AS SYSDBA -- OS 認證,Bequeath 協議,無需 Listener
SQLPLUS USER/PASS -- 本地 Bequeath,需資料庫 OPEN
SQLPLUS USER/PASS@LOCAL_SID -- 經 Listener,需 Listener 運行