Oracle Listener 如何知道資料庫服務存在?核心在於服務註冊。本文深度解析靜態註冊 (Listener.ora)、動態註冊 (PMON)、混合模式、local_listener 非預設配置、狀態檢查 (UNKNOWN vs READY/BLOCKED),並提供配置範本與遷移建議。
註冊 = 將資料庫實例/服務發布至 Listener,使 Client 僅需知道服務名即可連線,無須知悉實例名、主機、埠。Listener 維護服務清單,接收連線請求後轉交給對應的伺服器進程 (專用/共享)。
listener.ora 中的 SID_LIST,直接建立服務條目。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))
)
)
instance_name、service_names 參數,主動向 Listener 註冊。LOCAL_LISTENER (預設 LISTENER、埠 1521、TCP) 註冊。| 參數 | 用途 | 預設值 | 建議 |
|---|---|---|---|
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 環境設定 |
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_listener | PMON 需知道向哪個 Listener 註冊 |
| Data Guard Physical Standby | 靜態註冊 (Primary/Standby 皆設) | Standby 可能未開啟,靜態註冊確保 RMAN/Observer 可連線 |
| 外部程序 (extproc) | 靜態註冊 (固定 SID_DESC) | 無 PMON 註冊機制 |
| Listener 頻繁重啟、資料庫長期運行 | 動態 + 顯式參數 | PMON 定期重新註冊 (預設 60 秒),參數顯式確保快速恢復 |
LSNRCTL> status
服務摘要...
服務 "orcl" 具有 1 個實例。
實例 "orcl",狀態 UNKNOWN,具有 1 個處理程序... <-- 靜態註冊
服務 "orcl" 具有 1 個實例。
實例 "orcl",狀態 READY,具有 1 個處理程序... <-- 動態註冊
場景:Listener 監聽埠 1522,服務名 orcl。
listener.ora 設定 PORT=1522。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; -- 需重啟
ALTER SYSTEM REGISTER 觸發即時註冊。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 可註冊服務 (防惡意註冊)。動態註冊 + 顯式參數 是現代單機/RAC 的標準配置;靜態註冊 保留給 extproc、Standby、特殊啟動序列需求。理解 PMON 心跳機制、local_listener 導向、狀態語意 (UNKNOWN/READY/BLOCKED),能設計出高可用、可觀測、安全的網路服務發現架構。