Oracle ORA-12505,TNS:侦听器目前不知道连接描述符中给出的SID。通过JDBC实现Eclipse和Fedora 20

Oracle ORA-12505,TNS:侦听器目前不知道连接描述符中给出的SID。通过JDBC实现Eclipse和Fedora 20,oracle,jdbc,oracle11g,listener,fedora,Oracle,Jdbc,Oracle11g,Listener,Fedora,我已经在Fedora 20虚拟机上安装了Oracle 11g XE,对其进行了配置并设置了环境变量(运行Oracle_env.sh)。我在尝试通过jdbc将Eclipse与数据库连接时遇到了这个错误,使用以下字符串“jdbc.databaseurl=jdbc:oracle:thin:@192.168.88.134:1521:XE” 我可以通过SQL*Plus(sqlplus/as sysdba)连接到虚拟机中的数据库 $ORACLE\u SID变量正常(XE)。我已经尝试停止并启动侦听器,然后启

我已经在Fedora 20虚拟机上安装了Oracle 11g XE,对其进行了配置并设置了环境变量(运行
Oracle_env.sh
)。我在尝试通过jdbc将Eclipse与数据库连接时遇到了这个错误,使用以下字符串“jdbc.databaseurl=jdbc:oracle:thin:@192.168.88.134:1521:XE”

我可以通过SQL*Plus(
sqlplus/as sysdba
)连接到虚拟机中的数据库

$ORACLE\u SID
变量正常(
XE
)。我已经尝试停止并启动侦听器,然后启动数据库,并使用
altersystem寄存器命令

静态注册数据库也没有成功(我无法确定我没有错,所以如果有人认为这可以解决我的问题,我会再试一次)

以下是
listener.ora
文件:

# listener.ora Network Configuration File: 

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



LISTENER = 
  (DESCRIPTION_LIST = 
    (DESCRIPTION = 
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE)) 
          (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.88.134)(PORT = 1521)) 
    ) 
  ) 

DEFAULT_SERVICE_LISTENER = (XE) 
# tnsnames.ora Network Configuration File: 

XE = 
  (DESCRIPTION = 
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.88.134)(PORT = 1521)) 
    (CONNECT_DATA = 
      (SERVER = DEDICATED) 
      (SERVICE_NAME = XE) 
    ) 
  ) 

EXTPROC_CONNECTION_DATA = 
  (DESCRIPTION = 
    (ADDRESS_LIST = 
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE)) 
    ) 
    (CONNECT_DATA = 
      (SID = PLSExtProc) 
      (PRESENTATION = RO) 
    ) 
  ) 
以及
tnsnames.ora
文件:

# listener.ora Network Configuration File: 

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



LISTENER = 
  (DESCRIPTION_LIST = 
    (DESCRIPTION = 
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE)) 
          (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.88.134)(PORT = 1521)) 
    ) 
  ) 

DEFAULT_SERVICE_LISTENER = (XE) 
# tnsnames.ora Network Configuration File: 

XE = 
  (DESCRIPTION = 
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.88.134)(PORT = 1521)) 
    (CONNECT_DATA = 
      (SERVER = DEDICATED) 
      (SERVICE_NAME = XE) 
    ) 
  ) 

EXTPROC_CONNECTION_DATA = 
  (DESCRIPTION = 
    (ADDRESS_LIST = 
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE)) 
    ) 
    (CONNECT_DATA = 
      (SID = PLSExtProc) 
      (PRESENTATION = RO) 
    ) 
  ) 
lsnrctl状态

LSNRCTL for Linux: Version 11.2.0.2.0 - Production on 31-MAR-2014 01:22:35 

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

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC_FOR_XE))) 
STATUS of the LISTENER 
------------------------ 
Alias                     LISTENER 
Version                   TNSLSNR for Linux: Version 11.2.0.2.0 - Production 
Start Date                30-MAR-2014 22:41:35 
Uptime                    0 days 2 hr. 41 min. 1 sec 
Trace Level               off 
Security                  ON: Local OS Authentication 
SNMP                      OFF 
Default Service           XE 
Listener Parameter File   /u01/app/oracle/product/11.2.0/xe/network/admin/listener.ora 
Listener Log File         /u01/app/oracle/product/11.2.0/xe/log/diag/tnslsnr/192/listener/alert/log.xml 
Listening Endpoints Summary... 
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC_FOR_XE))) 
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.88.134)(PORT=1521))) 
Services Summary... 
Service "PLSExtProc" has 1 instance(s). 
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service... 
The command completed successfully
我几乎可以肯定,问题在于侦听器不知道数据库。前面的命令除了已经显示的内容外,还应该显示如下内容

Service XE has 1 instance.
Instance "XE", status READY, has 1 handler for this service
。。。但事实并非如此,我也不知道如何解决这个问题


我在这方面是新手,主要是在Linux上,因此我将非常感谢您建议的解决方案中的每一个细节。

这听起来像是您的数据库试图使用错误的IP地址注册以联系侦听器。您的侦听器被配置为在192.168.88.134上侦听,但如果配置发生过更改,则DB可能采用localhost(127.0.0.1)或旧的IP值

默认情况下,数据库将尝试根据服务器的外部主机名()进行注册,但您可能会从中获得意外值-因此
/etc/hosts
中的机器名有什么意义。不管是什么原因造成的,注册似乎失败了

您可以显式地告诉DB使用实际的侦听器地址进行注册:

alter system set local_listener = '192.168.88.134:1521' scope=memory;
alter system register;
如果这样做有效并且
lsnrctl services
现在显示
XE
,则使用
scope=both
重复
set
命令,使其在下次重新启动数据库时保持不变。

在侦听器中:

(地址=(协议=TCP)(主机=192.168.88.134)(端口=1521))

通常默认情况下,这里有一个主机名而不是IP地址。您是否做了一些特殊的操作以便在那里拥有该IP(192.168.88.134)?

故障排除:

  • 删除listener.ora(对于此初始设置,您不需要它。对其进行备份)
  • lsnrctl重新加载
  • 将XE添加到SID_列表中,如下所示:

    SID_LIST_LISTENER = 
      (SID_LIST = 
         (SID_DESC =
           (SID_NAME = XE)
           (ORACLE_HOME = /u01/app/oracle/product/11.2.0/xe)
         )    
         (SID_DESC = 
          (SID_NAME = PLSExtProc) 
          (ORACLE_HOME = /u01/app/oracle/product/11.2.0/xe) 
          (PROGRAM = extproc) 
        ) 
      )
    
    lsnrctl重新加载


    检查警报日志中的消息

    您的虚拟机是否有多个IP地址,其名称(从
    uname-n
    )在
    /etc/hosts
    和通过
    dig
    解析为什么?为了检查,您可以从SQL*Plus会话发出
    alter system register
    ,然后再次检查
    lsnrctl服务的输出;并检查
    show parameters local_listener
    是否显示空白值?据我所知,它只有一个IP地址。我尝试了“alter system register”但没有成功,侦听器状态没有改变。我刚刚看到您尝试了注册,对不起。但是您的机器名是什么(来自
    uname
    ),以及
    /etc/hosts
    对该名称有什么定义?uname:Linux。我不知道如何解释它,但这是/etc/hosts文件的内容:127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain 4::1 localhost localhost.localdomain localhost6 localhost6.localdomain 6i尝试过了,现在“lsnrctl status”终于显示了XE,JDBC连接工作得很好。实际上,这是有意义的,因为我必须更改侦听器正在侦听的IP地址才能使其正常工作。奇怪的是,在我的搜索中,我没有看到这方面的任何东西。非常感谢你!