【问题标题】:ORA-12505, TNS:listener does not currently know of SID given in connect descriptor. Eclipse and Fedora 20 via JDBCORA-12505, TNS:listener 当前不知道连接描述符中给出的 SID。 Eclipse 和 Fedora 20 通过 JDBC
【发布时间】:2014-05-11 05:20:45
【问题描述】:

我已经在 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_SID 变量没问题 (XE)。我已经尝试停止和启动监听器,然后启动数据库,并使用alter system register; 命令。

同样静态注册数据库但没有成功(我不能确定我这样做没有错,所以如果有人认为这可以解决我的问题,我会再试一次)。

这是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 文件:

# 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 status:

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 地址,它的名称(来自uname -n)在/etc/hostsdig 中解析为什么?只是检查一下,您能否从 SQL*Plus 会话中发出 alter system register,然后再次检查 lsnrctl services 输出;并检查show parameters local_listener是否显示空白值?
  • 据我所知,它只有一个 IP 地址。我尝试了“alter system register”但没有成功,监听器状态保持不变。
  • 我刚刚看到您尝试注册,抱歉。但是您的机器名称是什么(来自uname),/etc/hosts 的名称是什么?
  • uname:Linux。我不知道如何解释,但这是 /etc/hosts 文件的内容: 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

标签: oracle jdbc oracle11g listener fedora


【解决方案1】:

这听起来像是您的数据库正在尝试使用错误的 IP 地址注册以联系侦听器。您的侦听器配置为侦听 192.168.88.134,但数据库可能假设为 localhost (127.0.0.1),或者如果配置已更改,则为旧 IP 值。

默认情况下,数据库将尝试针对服务器的外部主机名 (the default when local_listener is blank) 进行注册,但您可能会从中获得意外的值 - 因此,/etc/hosts 中的机器名称很重要。不管是什么原因,注册似乎都失败了。

您可以明确告诉数据库使用实际的侦听器地址进行注册:

alter system set local_listener = '192.168.88.134:1521' scope=memory;
alter system register;

如果这有效并且lsnrctl services 现在显示XE,则使用scope=both 重复set 命令以使其在下次数据库重新启动时保持不变。

【讨论】:

  • 我试过了,现在“lsnrctl status”终于显示XE了,JDBC连接也完美了。实际上,这是有道理的,因为我必须更改侦听器正在侦听的 IP 地址才能使其正常工作。奇怪的是,我在搜索中没有看到任何关于此的内容。非常感谢!
【解决方案2】:

疑难解答:

  1. 删除 listener.ora(对于此初始设置,您不需要它。备份它)
  2. lsnrctl 重新加载

将 XE 添加到您的 SID_LIST 中,例如:

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 重新加载

检查警报日志以获取消息。

【讨论】:

    【解决方案3】:

    在你的 listener.ora 中:

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

    通常这里默认有一个主机名而不是 IP 地址。你有没有做一些特别的事情,以便在那里拥有那个 IP (192.168.88.134)?

    【讨论】:

      猜你喜欢
      • 2015-03-01
      • 2013-02-10
      • 2021-12-30
      • 2011-08-05
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      • 2014-06-06
      • 2015-08-31
      相关资源
      最近更新 更多