三大核心配置檔($ORACLE_HOME/network/admin)
| 檔案 | 角色 | 類比 | 關鍵參數 |
| sqlnet.ora | 客戶端名稱解析策略 | /etc/nsswitch.conf | NAMES.DIRECTORY_PATH=(TNSNAMES, HOSTNAME, LDAP) |
| tnsnames.ora | 連線別名映射 (TNS 別名 → 位址/服務) | /etc/hosts | ADDRESS(PROTOCOL/HOST/PORT), CONNECT_DATA(SERVICE_NAME/SID) |
| listener.ora | 伺服器端監聽器設定 | 服務註冊表 | SID_LIST_LISTENER, LISTENER(ADDRESS), GLOBAL_DBNAME |
連線建立完整流程
sqlplus user/pass@orcl
│
▼
1. 讀 sqlnet.ora → NAMES.DIRECTORY_PATH 順序
│
├─ TNSNAMES → 讀 tnsnames.ora 找 orcl → 取得 HOST/PORT/SERVICE_NAME
├─ HOSTNAME → DNS 解析 orcl 為 IP → 連線該 IP 尋找 GLOBAL_DBNAME=orcl
└─ LDAP/EZCONNECT → 其他策略
│
▼
2. TCP 連線至 Listener (HOST:PORT)
│
▼
3. Listener 依 SID_LIST_LISTENER / 動態註冊 找到目標 Instance
│
▼
4. 依 CONNECT_DATA (SERVER=DEDICATED/SHARED) 分配 Server Process
│
▼
5. Client 直接與 Server Process 通訊,Listener 任務結束
│
▼
6. 驗證 (密碼文件/OS/資料庫帳號) → Session 建立
三種連線模式對比
| 模式 | 語法 | 需 Listener | 需資料庫 Open | 適用場景 |
| OS 驗證 | sqlplus / as sysdba | 否 | 否 (可 Mount) | 本機維護、備份腳本 |
| Bequeath (本機) | sqlplus user/pass | 否 | 是 | 本機應用、無網路開銷 |
| 網路連線 | sqlplus user/pass@tns | 是 | 是 | 遠端應用、標準生產連線 |
listener.ora 關鍵配置詳解
# 靜態註冊 (啟動前已知)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl) # HOSTNAME 解析時用
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
(SID_NAME = orcl)
)
)
# 監聽端點 (支援多協議/多IP)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))
)
)
# 動態服務註冊 (PMON 自動註冊,無需 SID_LIST)
# 參數:LOCAL_LISTENER, REMOTE_LISTENER 控制註冊目標
tnsnames.ora 範本與參數
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
(LOAD_BALANCE = ON) # 客戶端負載均衡 (RAC)
(FAILOVER = ON) # 客戶端故障轉移
)
(CONNECT_DATA =
(SERVER = DEDICATED) # 專用服務器 (預設)
(SERVICE_NAME = orcl) # 推薦用服務名,非 SID
(FAILOVER_MODE = # TAF 透明應用故障轉移
(TYPE = SELECT)
(METHOD = BASIC)
(RETRIES = 180)
(DELAY = 5)
)
)
)
sqlnet.ora 關鍵參數
# 解析順序 (最常用)
NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)
# 連線逾時 (單位:秒)
SQLNET.OUTBOUND_CONNECT_TIMEOUT = 10
SQLNET.INBOUND_CONNECT_TIMEOUT = 60
# 安全
SQLNET.AUTHENTICATION_SERVICES = (NTS) # Windows OS 驗證
SQLNET.ENCRYPTION_CLIENT = REQUIRED # 強制加密
SQLNET.ENCRYPTION_TYPES_CLIENT = (AES256)
SQLNET.CRYPTO_CHECKSUM_CLIENT = REQUIRED # 強制完整性校驗
# 追蹤/日誌
TRACE_LEVEL_CLIENT = OFF
LOG_DIRECTORY_CLIENT = /var/log/oracle
疑難排解工具箱
| 工具/命令 | 用途 | 範例 |
| tnsping | 驗證 TNS 別名解析 + Listener 連通性 | tnsping orcl |
| lsnrctl status | 檢視 Listener 狀態、已註冊服務、端點 | lsnrctl status |
| lsnrctl services | 詳細服務/實例/處理器狀態 | lsnrctl services |
| sqlplus -L | 快速測試連線 (失敗即退出,不進提示) | sqlplus -L user/pass@orcl |
| TNSPING + TRACE | 啟用客戶端 Trace 分析解析過程 | sqlnet.ora 加 TRACE_LEVEL_CLIENT=ADMIN |
| netca / netmgr | 圖形化配置工具 (生成上述三檔) | netmgr |
常見錯誤代碼速查
ORA-12154:TNS 解析失敗 → 檢查 tnsnames.ora 路徑、別名拼寫、sqlnet.ora 解析順序。
ORA-12514:Listener 不識別服務 → 檢查 SERVICE_NAME 拼寫、動態註冊是否生效 (PMON)、靜態 SID_LIST GLOBAL_DBNAME。
ORA-12541:無 Listener → 啟動 lsnrctl start、檢查防火牆、端口衝突、HOST 設為 0.0.0.0。
ORA-12505:SID 不識別 → 用 SERVICE_NAME 替代 SID、檢查靜態註冊 SID_NAME。
ORA-28000:帳號鎖定 → ALTER USER ... ACCOUNT UNLOCK。
Hostname 命名法 (免 tnsnames.ora)
# 伺服器端 listener.ora 靜態註冊需設 GLOBAL_DBNAME
SID_LIST_LISTENER = (SID_LIST=(SID_DESC=(GLOBAL_DBNAME=myhost)(SID_NAME=orcl)...))
# 客戶端 sqlnet.ora
NAMES.DIRECTORY_PATH = (HOSTNAME) # 移除 TNSNAMES
# 連線
sqlplus user/pass@myhost # 直接解析 myhost IP,連線該 Listener 尋找 GLOBAL_DBNAME=myhost
優點:客戶端零配置。缺點:依賴 DNS/hosts 正確、單實例限制、無負載均衡/故障轉移。
總結
掌握「解析 → 連線 → 註冊 → 分配 → 驗證」五階段模型,配合 tnsping/lsnrctl 兩大神器,90% 網路問題可在分鐘級定位。生產環境建議:統一使用 SERVICE_NAME、啟用動態註冊、配置 TAF、強制加密、集中管理 tnsnames.ora (共享存儲/版本控制)。