Oracle-11g

如何在 listener.ora 中配置沒有 SID_LIST_LISTENER 的 Oracle Listener?

  • April 16, 2018

我可以使用以下 listener.ora 訪問 ORACLE 11g 伺服器

# listener.ora Network Configuration File: D:\app\Administrator\product\11.1.0\db_1\NETWORK\ADMIN\listener.ora
# Generated by Oracle configuration tools.

LISTENER =
 (DESCRIPTION_LIST =
   (DESCRIPTION =
     (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
   )
   (DESCRIPTION =
     (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.111.111)(PORT = 1521))
   )
 )

它為該伺服器上的所有實例提供服務,我可以通過以下方式驗證

lsnrctl status

我的問題是,當我在虛擬機中全新安裝 Oracle 11g 時,我必須使用 listener.ora 之類的

# listener.ora Network Configuration File: C:\app\oracle\product\11.2.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
 (SID_LIST =
   (SID_DESC =
     (SID_NAME = CLRExtProc)
     (ORACLE_HOME = C:\app\oracle\product\11.2.0\dbhome_1)
     (PROGRAM = extproc)
     (ENVS = "EXTPROC_DLLS=ONLY:C:\app\oracle\product\11.2.0\dbhome_1\bin\oraclr11.dll")
   )

  (SID_DESC =
    (GLOBAL_DBNAME = ORCL)
    (ORACLE_HOME = C:\app\oracle\product\11.2.0\dbhome_1)
    (SID_NAME = orcl)
   )

  (SID_DESC =
    (GLOBAL_DBNAME = BMBK)
    (ORACLE_HOME = C:\app\oracle\product\11.2.0\dbhome_1)
    (SID_NAME = BMBK)
   )

)

LISTENER =
 (DESCRIPTION_LIST =
   (DESCRIPTION =
     (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
     (ADDRESS = (PROTOCOL = TCP)(HOST = 169.254.200.102)(PORT = 1521))
     (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
   )
 )

ADR_BASE_LISTENER = C:\app\oracle

沒有 SID_LIST_LISTENER 實體,即使用來自我得到的其他伺服器的 listener.ora

C:\Windows\system32>lsnrctl status

LSNRCTL for 64-bit Windows: Version 11.2.0.1.0 - Production on 27-NOV-2011 10:14
:24

Copyright (c) 1991, 2010, Oracle.  All rights reserved.

Anmeldung bei (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
STATUS des LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for 64-bit Windows: Version 11.2.0.1.0 - Produ
ction
Startdatum                27-NOV-2011 10:14:08
Uptime                    0 Tage 0 Std. 0 Min. 18 Sek.
Trace-Ebene               off
Sicherheit                ON: Local OS Authentication
SNMP                      OFF
Parameterdatei des Listener C:\app\oracle\product\11.2.0\dbhome_1\network\admin\
listener.ora
Log-Datei des Listener    c:\app\oracle\diag\tnslsnr\WSV-BK-W7en64-S\listener\al
ert\log.xml
Zusammenfassung Listening-Endpunkte...
 (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1521ipc)))
 (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=169.254.200.102)(PORT=1521)))
Der Listener unterst³tzt keine Services
Der Befehl wurde erfolgreich ausgef³hrt.

最後一條消息轉換為

偵聽器不支持任何服務。

我不知道為什麼這兩個伺服器的行為不同。我在配置文件和系統資料庫項中都沒有發現任何提示。

編輯:

我想答案隱藏在Burleson Consulting 的這篇文章中,但我沒有找到實際配置的位置。

在這個派對上有點晚了……

數據庫應該自動向偵聽器註冊,使SID_LIST條目變得多餘,這似乎發生在您的192.168.111.111環境中。如果偵聽器在數據庫之後啟動,它可能需要一段時間才能註冊,並且可能存在根本不這樣做的情況。

您可以嘗試使用命令使其註冊alter system register。數據庫使用該LOCAL_LISTENER參數來標識它應該註冊的偵聽器。預設情況下為 null,根據文件,它相當於hostname:1521.

如果alter system register沒有使服務出現在lsnrctl status輸出中,那麼我懷疑它無法辨識主機名或解析它,或者它解析到與偵聽器所在的地址不同的地址,或者LOCAL_LISTENER設置為無效的虛擬盒子。您可以將 設置為直接LOCAL_LISTENER匹配listener.ora,例如:

alter system set LOCAL_LISTENER='(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))' scope=both;
alter system register;

或者,您可以使用包含這些詳細資訊的別名tnsnames.ora。例如,如果您添加tnsnames.ora如下條目:

MY_LISTENER =
 (DESCRIPTION =
   (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
 )

然後你可以:

alter system set local_listener='MY_LISTENER' scope=both;
alter system register;

tnsnames.ora除了簡潔之外,我可以看到使用該版本的唯一真正優勢是您可以在 SQL*Net 文件中而不是在數據庫中更改配置;甚至只有在您在機器之間複製數據庫,或者讓您的偵聽器和數據庫在不同帳戶下執行(例如,使用gridRAC/HA 使用者)時,這似乎才真正有用。

LOCAL_LISTENER 這裡還有更多內容。

**編輯:**這似乎很全面

我有一個類似的問題,發現只是關閉並重新啟動實例會導致它正確註冊。

這可以通過使用 sqlplus 命令行來完成。您需要以具有 SYSDBA 權限(例如係統)語法的使用者身份登錄:

sqlplus name/pass as SYSDBA

然後執行“關機”並等待它完成。然後執行“啟動”並等待它完成。

手指交叉,您現在應該有一個向偵聽器註冊的實例。

要檢查是否是這種情況,您可以啟動 lsnrctl 並執行命令“status”。如果它不起作用,您仍然會看到消息“偵聽器不支持任何服務”,否則您會看到類似

Service "horse" has 1 instance(s).
Instance "horse", status READY, has 1 handler(s) for this service...

引用自:https://dba.stackexchange.com/questions/8434