如何在 listener.ora 中配置没有 SID_LIST_LISTENER 的 Oracle 侦听器?

ber*_*d_k 13 oracle-11g listener

我可以使用以下 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))
    )
  )
Run Code Online (Sandbox Code Playgroud)

它为该服务器上的所有实例提供服务,我可以通过以下方式验证

lsnrctl status
Run Code Online (Sandbox Code Playgroud)

我的问题是,当我在虚拟机中全新安装 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
Run Code Online (Sandbox Code Playgroud)

没有 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.
Run Code Online (Sandbox Code Playgroud)

最后一条消息翻译成

侦听器不支持任何服务。

我不知道为什么这两个服务器的行为不同。我在配置文件和注册表项中都没有发现任何提示。

编辑:

我想答案就在Burleson Consulting 的这篇文章中某个地方,但我没有找到它实际配置的位置。

Ale*_*ole 14

这个派对有点晚了......

数据库应自动向侦听器注册,使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;
Run Code Online (Sandbox Code Playgroud)

或者您可以使用在您的tnsnames.ora. 例如,如果您添加如下tnsnames.ora条目:

MY_LISTENER =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
  )
Run Code Online (Sandbox Code Playgroud)

那么你可以:

alter system set local_listener='MY_LISTENER' scope=both;
alter system register;
Run Code Online (Sandbox Code Playgroud)

tnsnames.ora除了简洁之外,我能看到使用该版本的唯一真正优势是您可以更改 SQL*Net 文件中的配置,而不是数据库中的配置;甚至如果您在机器之间克隆数据库,或者让您的侦听器和数据库在不同帐户下运行(例如,grid使用 RAC/HA 用户),那么这似乎真的很有用。

还有更多的LOCAL_LISTENER 在这里

编辑:而且似乎相当全面。