首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 三大網絡配置文件深度解析:sqlnet.ora、tnsnames.ora、listener.ora

     編輯:Oracle 資料庫基礎

文件定位與加載順序

三文件均位於 $ORACLE_HOME/network/admin/ (或 TNS_ADMIN 指定目錄)。
加載優先級: 當前目錄 → TNS_ADMIN → $ORACLE_HOME/network/admin → /etc (Linux)。

1. sqlnet.ora —— 客戶端解析策略控制器

核心參數: NAMES.DIRECTORY_PATH

SQLNET.AUTHENTICATION_SERVICES = (NTS)
NAMES.DIRECTORY_PATH = (TNSNAMES, HOSTNAME, EZCONNECT)

解析順序邏輯:

  1. 嘗試 TNSNAMES:讀取 tnsnames.ora 解析別名
  2. 失敗則嘗試 HOSTNAME:將別名視為主機名,通過 DNS/hosts 解析 IP,連接該 IP 上 GLOBAL_DBNAME=別名的實例
  3. 再嘗試 EZCONNECT:易連接命名法 host:port/service_name
  4. 最後 LDAP:企業目錄服務(少用)

實戰建議: 生產環境建議精簡為 (TNSNAMES, EZCONNECT),禁用 HOSTNAME 避免誤解析。

2. tnsnames.ora —— 客戶端「電話簿」

定義 Net Service Name → 連接描述符 的映射。

標準條目結構

ORCL =                          -- 連接別名 (sqlplus user/pwd@ORCL)
  (DESCRIPTION =
    (ADDRESS_LIST =              -- 地址列表 (支持故障轉移/負載均衡)
      (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
      -- (ADDRESS = (PROTOCOL = TCP)(HOST = standby)(PORT = 1521))  -- 備庫
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)       -- 專用/共享服務器
      (SERVICE_NAME = orcl)      -- 服務名 (show parameter service_name)
      -- (SID = orcl)             -- 或使用 SID (舊版)
      -- (INSTANCE_NAME = orcl1)  -- RAC 指定實例
    )
  )

關鍵參數解析

參數來源/驗證方法
HOST服務端 hostname 或 ifconfig/ipconfig;客戶端必須 ping 通
PORT服務端 lsnrctl status 顯示的 Listening Endpoints
SERVICE_NAME服務端 SQL> SHOW PARAMETER service_name
SERVERDEDICATED (默認) / SHARED (需服務端配置 Dispatcher)

多別名示例

SALES =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.188.219)(PORT = 1521))
    (CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = sales))
  )

# 關鍵提示:若服務端用 MTS(共享服務器),DB Link 必須顯式指定 (SERVER=DEDICATED) 避免分布式事務 Bug

3. listener.ora —— 服務端監聽進程配置

定義 Listener 進程監聽端點及服務實例註冊信息(靜態註冊)。

最小化配置範例

LISTENER =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = server_hostname)(PORT = 1521))
  )

# 靜態註冊 (非必需,10g+ 支持動態註冊)
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)
    )
  )

關鍵認知

  • Listener 僅負責握手分發,連接建立後即退出,不參與後續數據傳輸。
  • 關閉 Listener 不影響已建立會話。
  • 動態註冊 (PMON 進程定期向 Listener 註冊) 是 9i+ 默認行為,SID_LIST 多用於:
    ① 尚未啟動的實例 (如 Data Guard 待機庫)
    ② 外部過程 (extproc)
    ③ 異構服務 (DG4ODBC 等)

連接全鏈路追蹤

sqlplus sys/oracle@orcl
1. 讀 sqlnet.ora → NAMES.DIRECTORY_PATH = (TNSNAMES)
2. 讀 tnsnames.ora → 找 ORCL → 獲取 HOST, PORT, SERVICE_NAME
3. TCP 連接 HOST:PORT → Listener 接收
4. Listener 驗證 SERVICE_NAME → 派生 Server Process (DEDICATED/SHARED)
5. Server Process 接管會話 → Listener 任務結束

三種連接方式對比

故障排查三板斧

  1. lsnrctl status:確認服務端 Listener 運行、服務已註冊
  2. tnsping alias:驗證客戶端解析路徑、網絡達到 Listener
  3. SQL> SHOW SGA / SELECT OPEN_MODE FROM V$DATABASE:確認實例/數據庫狀態

hosts 文件維護提醒

客戶端 C:\Windows\System32\drivers\etc\hosts 或 /etc/hosts 必須包含服務端 IP→Hostname 映射,私有 IP 優先於公網 IP。


總結: 吃透這三個文件的交互邏輯,網絡配置不再是玄學。記住核心鏈路:sqlnet.ora 定策略 → tnsnames.ora 查地址 → listener.ora 接請求。善用 tnsping 驗證解析鏈路,lsnrctl services 確認服務註冊。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
語法認證方式是否需 Listener適用場景
sqlplus / as sysdbaOS 認證 (OSDBA 組)否 (Bequeath 协议)本地維護、數據庫未啟動時
sqlplus sys/oracle數據庫密碼文件/字典否 (Bequeath/IPC)本地連接、無網絡開銷
sqlplus sys/oracle@orcl網絡密碼驗證是遠程連接、應用服務器