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

Oracle 監聽器靜態與動態註冊機制全解析:LISTENER.ORA GLOBAL_DBNAME vs PMON 動態服務發現

     編輯:Oracle 資料庫相關知識

註冊本質

數據庫實例向 Listener 發布服務名,客戶端僅需服務名即可連接,無需知曉 SID/主機/端口細節。啟動實例時默認註冊兩條信息:實例名、服務名。

靜態註冊

實例啟動讀取 listener.ora 中 SID_LIST_LISTENER 區段:

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC = (SID_NAME=PLSExtProc)(ORACLE_HOME=...)(PROGRAM=extproc))
    (SID_DESC = (GLOBAL_DBNAME=orcl)(ORACLE_HOME=...)(SID_NAME=orcl))
    (SID_DESC = (GLOBAL_DBNAME=orcl1)(ORACLE_HOME=...)(SID_NAME=orcl))
  )
  • GLOBAL_DBNAME:對外發布的服務名 (可多個映射同一 SID)。
  • SID_NAME:實例名 (註冊到 Listener 的實例標識)。
  • 優點:實例未啟動時也可被連接請求喚醒 (舊版專用)。
  • 缺點:維護成本高、多實例易衝突、不支援負載均衡。

動態註冊 (PMON)

實例啟動後 PMON 進程讀取初始化參數自動向 Listener 註冊:

  • INSTANCE_NAME:實例名 (缺省 = DB_NAME)。
  • SERVICE_NAMES:服務名列表 (缺省 = DB_NAME.DB_DOMAIN 或 DB_UNIQUE_NAME),支援多值逗號分隔。

驗證:LSNRCTL> SERVICES 輸出中 Service "orcl" has 1 instance(s). Instance "orcl", status READY... 即為動態註冊。

參數優先級與缺省邏輯

參數缺省值說明
INSTANCE_NAMEDB_NAME實例標識,RAC 每節點不同
SERVICE_NAMESDB_NAME.DB_DOMAIN可多值,支援同一實例發布多服務名
DB_DOMAINNULL若為 NULL,服務名 = DB_NAME
DB_UNIQUE_NAMEDB_NAMEData Guard 環境區分主備

最佳實踐

  • 生產環境僅使用動態註冊,listener.ora 僅保留 LISTENER 地址配置,刪除 SID_LIST_LISTENER。
  • RAC 環境每節點設置唯一 INSTANCE_NAME、共享 SERVICE_NAMES,實現客戶端負載均衡 (LOAD_BALANCE=ON) 與故障轉移 (FAILOVER=ON)。
  • 定期 LSNRCTL SERVICES 檢查 READY 狀態,異常時重啟 PMON (ALTER SYSTEM REGISTER) 強制重註冊。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved