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

Oracle 靜態註冊與動態註冊深度解析:Listener.ora、PMON、服務發現機制全圖解

     編輯:Oracle 資料庫相關知識

Oracle Listener 如何知道資料庫服務存在?核心在於服務註冊。本文深度解析靜態註冊 (Listener.ora)、動態註冊 (PMON)、混合模式、local_listener 非預設配置、狀態檢查 (UNKNOWN vs READY/BLOCKED),並提供配置範本與遷移建議。

核心概念:什麼是註冊?

註冊 = 將資料庫實例/服務發布至 Listener,使 Client 僅需知道服務名即可連線,無須知悉實例名、主機、埠。Listener 維護服務清單,接收連線請求後轉交給對應的伺服器進程 (專用/共享)。

一、靜態註冊

機制

  • Listener 啟動時讀取 listener.ora 中的 SID_LIST,直接建立服務條目。
  • 不依賴資料庫啟動狀態;資料庫關閉時服務仍顯示 UNKNOWN。
  • 適用:外部程序 (extproc)、Data Guard Standby、非標準埠/多 Listener、資料庫尚未啟動時需連線 (如 RMAN 復原)。

listener.ora 範本

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =                    # 外部程序 (固定)
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
      (PROGRAM = extproc)
    )
    (SID_DESC =                    # 使用者資料庫 - 服務 orcl
      (GLOBAL_DBNAME = orcl)       # 服務名 (對外發布)
      (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
      (SID_NAME = orcl)             # 實例名
    )
    (SID_DESC =                    # 同一實例提供第二個服務名
      (GLOBAL_DBNAME = orcl_pdb1)
      (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
      (SID_NAME = orcl)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL=TCP)(HOST=0.0.0.0)(PORT=1521))
    )
  )

二、動態註冊

機制

  • 資料庫啟動時,PMON 背景進程 讀取 instance_name、service_names 參數,主動向 Listener 註冊。
  • 預設向 LOCAL_LISTENER (預設 LISTENER、埠 1521、TCP) 註冊。
  • 資料庫關閉時 PMON 自動註銷,Listener 服務清單即時移除 → 狀態即時準確 (READY/BLOCKED)。
  • 支援負載平衡、Failover、連線重導向。

關鍵初始化參數

參數用途預設值建議
instance_name註冊的實例名db_name顯式設定,避免與 db_name 不同導致混淆
service_names註冊的服務名 (可多值,逗號分隔)db_name.db_domain必須顯式設定,如 orcl, orcl_pdb1, sales.example.com
local_listener非預設 Listener 連線描述無 (預設 LISTENER:1521)非 1521 埠、多 Listener、RAC 時必設
remote_listener遠端 Listener (RAC SCAN Listener)無RAC 環境設定

動態註冊 listener.ora (極簡)

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
      (PROGRAM = extproc)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL=TCP)(HOST=0.0.0.0)(PORT=1521))
    )
  )

注意:動態註冊不需要 在 Listener.ora 寫入資料庫 SID_DESC,僅保留 extproc 即可。

三、混合模式與遷移建議

場景建議模式理由
單機、標準 1521、單一服務動態註冊零維護、狀態即時、支援負載平衡
非標準埠 (如 1522)、多 Listener動態 + local_listenerPMON 需知道向哪個 Listener 註冊
Data Guard Physical Standby靜態註冊 (Primary/Standby 皆設)Standby 可能未開啟,靜態註冊確保 RMAN/Observer 可連線
外部程序 (extproc)靜態註冊 (固定 SID_DESC)無 PMON 註冊機制
Listener 頻繁重啟、資料庫長期運行動態 + 顯式參數PMON 定期重新註冊 (預設 60 秒),參數顯式確保快速恢復

四、狀態檢查:UNKNOWN vs READY/BLOCKED

LSNRCTL> status
服務摘要...
服務 "orcl" 具有 1 個實例。
  實例 "orcl",狀態 UNKNOWN,具有 1 個處理程序...  <-- 靜態註冊
服務 "orcl" 具有 1 個實例。
  實例 "orcl",狀態 READY,具有 1 個處理程序...   <-- 動態註冊
  • UNKNOWN:Listener 僅知服務名存在 (靜態註冊),不確認實例是否存活。連線請求到達時才嘗試啟動伺服器進程驗證。
  • READY:動態註冊,PMON 定期心跳確認實例存活、可接受連線。
  • BLOCKED:動態註冊,實例為 Standby/受限模式,拒絕一般連線。

五、非預設 Listener 配置:local_listener 實戰

場景:Listener 監聽埠 1522,服務名 orcl。

  1. listener.ora 設定 PORT=1522。
  2. 資料庫參數:
    ALTER SYSTEM SET local_listener = '(ADDRESS=(PROTOCOL=TCP)(HOST=db-host)(PORT=1522))' SCOPE=BOTH;
    ALTER SYSTEM SET service_names = 'orcl' SCOPE=BOTH;
    ALTER SYSTEM SET instance_name = 'orcl' SCOPE=SPFILE;  -- 需重啟
    
  3. 重啟資料庫或 ALTER SYSTEM REGISTER 觸發即時註冊。
  4. lsnrctl services 驗證服務顯示 READY。

六、安全強化

  • ADMIN_RESTRICTIONS_LISTENER = ON:禁止遠程 lsnrctl set/stop/start 修改運行時配置。
  • lsnrctl change_password + set password:管理操作需密碼。
  • VALID_NODE_CHECKING_REGISTRATION_LISTENER = ON + REGISTRATION_INVITED_NODES:限制哪些 IP 可註冊服務 (防惡意註冊)。
  • 防火牆僅開放應用伺服器 IP 存取 Listener 埠。

結語

動態註冊 + 顯式參數 是現代單機/RAC 的標準配置;靜態註冊 保留給 extproc、Standby、特殊啟動序列需求。理解 PMON 心跳機制、local_listener 導向、狀態語意 (UNKNOWN/READY/BLOCKED),能設計出高可用、可觀測、安全的網路服務發現架構。

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