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

Oracle 客戶端連線設定完整指南:sqlnet.ora、tnsnames.ora、hosts 與環境變數

     編輯:Oracle 資料庫相關知識

核心設定檔架構

Oracle Net Services 依賴三大設定檔,預設位於 $ORACLE_HOME/network/admin,可透過 TNS_ADMIN 環境變數指向自訂目錄。

1. sqlnet.ora — 客戶端名稱解析策略

# 預設參數
NAMES.DEFAULT_DOMAIN = WORLD
NAMES.DIRECTORY_PATH = (TNSNAMES, ONAMES, HOSTNAME)

# 若客戶端/伺服器預設網域不同,註解第一行避免自動補綴
# NAMES.DEFAULT_DOMAIN = WORLD
  • NAMES.DIRECTORY_PATH:解析順序 — 本地 tnsnames.ora → Oracle Names Server (已淘汰) → 主機名稱解析。
  • 伺服器端可設定 SQLNET.EXPIRE_TIME = 10 偵測死連線(單位:分鐘)。

2. tnsnames.ora — 連線描述符定義

# 標準專用連線 (Dedicated Server)
APPDB =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.35)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = appdb)
    )
  )

# 明確指定專用連線 (避免 MTS/Shared Server 分散式交易 Bug)
APPDB_DEDICATED =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.35)(PORT = 1521))
    (CONNECT_DATA =
      (SERVICE_NAME = appdb)
      (SERVER = DEDICATED)
    )
  )

# 多 Listener 負載平衡 (Client-side Load Balancing)
APPDB_LB =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.35)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.35)(PORT = 1856))
      (LOAD_BALANCE = ON)  -- 預設 ON
    )
    (CONNECT_DATA =
      (SERVICE_NAME = appdb)
    )
  )

# 連線逾時與重試 (12c+ 推薦)
APPDB_RETRY =
  (DESCRIPTION =
    (CONNECT_TIMEOUT = 10)        -- 整體連線逾時秒數
    (RETRY_COUNT = 3)             -- 重試次數
    (RETRY_DELAY = 2)             -- 重試間隔秒數
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.35)(PORT = 1521))
    (CONNECT_DATA = (SERVICE_NAME = appdb))
  )

3. hosts 檔案 — IP/主機名對應 (關鍵!)

**即使 tnsping 成功,SQL*Plus/JDBC 仍可能失敗**,主因為 DNS 無法反解主機名。請在客戶端 /etc/hosts (Linux/Unix) 或 C:\Windows\System32\drivers\etc\hosts (Windows) 加入:

127.0.0.1       localhost
192.168.0.35    oracledb.oracledomain.com  oracledb
192.168.0.45    tomcat.tomcatdomain.com    tomcat
# 私有 IP 優先,公網 IP 其次
編輯前備份、用複製貼上避免 Tab/空格錯誤、私有 IP 寫在前面。

Unix/Linux 多資料庫環境必要環境變數

# .bash_profile 或 .profile
export ORACLE_SID=appdb          # 預設本地實例
export TWO_TASK=appdb            # sqlplus 無 @alias 時的預設連線目標 (相當於 @appdb)
# 注意:TWO_TASK 僅影響 OCI/厚客戶端,JDBC Thin 需在連線字串指定

常見連線失敗排查清單

  1. tnsping alias 成功但 sqlplus user/pwd@alias 失敗 → 檢查 hosts 檔案 與 防火牆 1521/1526 port。
  2. ORA-12154 / ORA-12545 → tnsnames.ora 別名拼寫、sqlnet.ora NAMES.DIRECTORY_PATH 順序。
  3. ORA-12514 / ORA-12505 → Listener 未註冊該 SERVICE_NAME,檢查 lsnrctl services。
  4. JDBC Thin 連不上 → 確認 jdbc:oracle:thin:@//host:port/service_name 格式,且伺服器 local_listener 參數正確。

結語

Oracle 客戶端連線看似繁瑣,實則邏輯清晰:**sqlnet.ora 定策略 → tnsnames.ora 存描述符 → hosts 保解析 → 環境變數設預設值**。建議將標準化 tnsnames.ora 納入版控,部署時由自動化工具分發,消除手動設定差異。

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