首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle Net 網路架構深度解析:三大配置檔、連線流程與疑難排解全攻略

     編輯:Oracle 資料庫相關知識

三大核心配置檔($ORACLE_HOME/network/admin)

檔案角色類比關鍵參數
sqlnet.ora客戶端名稱解析策略/etc/nsswitch.confNAMES.DIRECTORY_PATH=(TNSNAMES, HOSTNAME, LDAP)
tnsnames.ora連線別名映射 (TNS 別名 → 位址/服務)/etc/hostsADDRESS(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 (共享存儲/版本控制)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved