ORA-12505,TNS:监听器当前不知道连接描述符中给出的SID

Lea*_*ner 137 oracle jdbc

我在Windows 7 64位操作系统中安装了Oracle 11g Express Edition Release 2并试图执行JDBC程序,然后出现以下错误:

java.sql.SQLException: Listener refused the connection with the following error:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:412)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:531)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:221)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:503)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at com.jlcindia.jdbc.JDBCUtil.geOracleConnection(JDBCUtil.java:28)
    at Lab3O.main(Lab3O.java:15)
Caused by: oracle.net.ns.NetException: Listener refused the connection with the following error:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
    at oracle.net.ns.NSProtocol.connect(NSProtocol.java:385)
    at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1042)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:301)
    ... 8 more
Run Code Online (Sandbox Code Playgroud)

小智 164

我通过纠正我的jdbc字符串修复了这个问题.

例如,正确的jdbc字符串应该是......

jdbc:oracle:thin:@myserver:1521/XE
Run Code Online (Sandbox Code Playgroud)

但是我使用的jdbs字符串是......

jdbc:oracle:thin:@myserver:1521:XE
Run Code Online (Sandbox Code Playgroud)

(注意:之间1521XE应该是/)

这个错误的jdbc字符串也给我一个ORA-12505错误.

  • 如果您使用/它是一个网络服务名称,如果您使用冒号它是一个SID. (46认同)
  • 在 Intellij 的数据库视图中替换 : by / 对我有用,非常感谢! (4认同)

Luk*_*ard 85

有一些事情可能导致此问题,但在开始使用JDBC之前,您需要确保可以使用SQL*Plus连接到数据库.如果您不熟悉SQL*Plus,它是一个用于连接Oracle数据库的命令行工具,Oracle数据库长期以来一直是Oracle的标准组成部分,它包含在Oracle XE中.

使用JDBC连接到Oracle数据库时,不直接连接到数据库.而是连接到TNS侦听器,然后将您连接到数据库.该错误ORA-12505意味着侦听器已启动并且您可以连接到它,但它无法将您连接到数据库,因为它不知道该数据库已启动.有两个原因:

  • 数据库尚未启动,
  • 数据库尚未向侦听器注册,例如因为数据库是在侦听器之前启动的.(当数据库启动时,如果侦听器已在运行,它会向侦听器注册.如果侦听器未运行,则数据库不会自行注册,如果侦听器启动,则不会查找可能的数据库注册.)

ORA-12505表示侦听器知道该数据库,但侦听器尚未从数据库收到数据库已启动的通知.(如果您尝试使用错误的SID连接到错误的数据库,则会收到ORA-12154错误"TNS:无法解析指定的连接标识符".)

"服务"管理单元中正在运行哪些Oracle服务?(从"控制面板">"管理工具">"服务"中打开它,或者只需"开始">"运行"> services.msc.)您需要运行OracleServiceXE和OracleXETNSListener服务.

如果服务都已启动,您是否可以在命令提示符下使用以下任何一种方法连接到SQL*Plus中的数据库?(我假设您在已安装Oracle XE的计算机上运行这些程序.)

sqlplus system/system-password@XE
sqlplus system/system-password
sqlplus / as sysdba

(替换system-password为在Oracle XE安装期间为SYS和SYSTEM用户设置的密码.)

这三个中的第一个通过TNS监听器连接,但后两个连接直接连接到数据库而不通过监听器,只有当您与数据库在同一台机器上时才能工作.如果第一个失败但其他两个失败,那么JDBC连接也将失败.如果是这样,请使用其他两个中的任何一个连接到数据库并运行ALTER SYSTEM REGISTER.然后退出SQL*Plus并再次尝试第一个表单.

如果第三个失败但第二个失败,请将您的用户帐户添加到ora_dba组.在控制面板>计算机管理>本地用户和组中执行此操作.

一旦你可以得到表格的连接

sqlplus system/system-password@XE

要工作,您应该能够通过JDBC连接到Oracle XE.(顺便说一下,你没有向我们展示你用来连接数据库的JDBC代码,但是我怀疑它很可能是正确的;如果连接字符串的某些部分是错误的,那么会有各种其他错误.)

  • @Raj:我没看到你的编辑带来什么答案,所以我删除了它.如果您想为问题投入大量资金,请发布您自己的答案,而不是编辑其他人的答案. (3认同)

Raj*_*Raj 39

我也得到了同样的错误但是当他们尝试了所有这三个失败时.如果以上三个失败.如果你发现服务(我的情况下是XE)丢失,请尝试LSNRCTL状态试试这个 现在你可以看到服务 即使看不到尝试这个sqlplus /nolog conn system ... password ... connected. alter system register;
exit
lsnrctl stat
...



sqlplus /nolog
conn system
... password ... connected.
alter system set local_listener = '(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))' scope = both;
... system altered ...
alter system register;
exit
lsnrctl stat

这应该可行......

  • 你做到了,伙计!设置“local_listener”后,orcl 侦听器现在显示在“lsnrctl”中。太感谢了! (2认同)
  • `alter system set local_listener = ...` 对我有用。 (2认同)

小智 29

当您收到此错误"ORA-12505时,TNS:侦听器当前不知道连接描述符中给出的SID"

解决方案:打开服务,然后开始OracleServiceXE尝试连接...

  • 我有同样的问题,但运行 OracleServiceXE。因此,重新启动 OracleServiceXE 服务对我有用。不知道为什么?! (2认同)

raj*_*esh 10

我找到了这个例外的原因.他们是

1)默认情况下数据库XE的名称.所以url将是" jdbc:oracle:thin:@localhost:1521:XE ".

2)确保OracleServiceXE,OracleXETNSListener正在运行.它将位于控制面板\所有控制面板项\管理工具\服务中


Pie*_*e C 10

如果您在 Oracle SQL Developer 中有一个工作连接,请使用连接菜单上的信息来构建您的 url,如下图所示:

在此处输入图片说明

在上面的例子中,网址是: jdbc:oracle:thin:@ORADEV.myserver.com:1521/myservice

请注意,如果您使用的是 SID,则主机名后面有一个冒号 (":") 而不是斜杠 ("/")。

  • 谢谢,很有用,正需要这个 (3认同)

jav*_*ner 8

我通过纠正我的JDBC代码解决了这个问题.

正确的JDBC字符串应该是......

conection = DriverManager.getConnection
("jdbc:oracle:thin:@localhost:1521:xe","system","ishantyagi");
Run Code Online (Sandbox Code Playgroud)

但我使用的JDBC字符串是......

conection = DriverManager.getConnection
("jdbc:oracle:thin:@localhost:1521:orcl","system","ishantyagi");
Run Code Online (Sandbox Code Playgroud)

因此,指定orcl而不是xe的错误显示此错误,因为SID名称错误.


小智 8

当我使用以下代码时,我的问题得到了解决:

Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@IPAddress:1521/servicename","userName","Password");
Run Code Online (Sandbox Code Playgroud)


Nir*_*gal 7

面对类似的错误,上述任何解决方案都没有帮助.listner.ora文件中存在问题.我错误地添加SIDSID_LIST下面看到的(星星之间的部分*).

 SID_LIST_LISTENER =
      (SID_LIST =

        (SID_DESC =
          (SID_NAME = PLSExtProc)
          (ORACLE_HOME = C:\oraclexe\app\oracle\product\11.2.0\server)
          (PROGRAM = extproc)
        )
        (SID_DESC =
          (SID_NAME = CLRExtProc)
          (ORACLE_HOME = C:\oraclexe\app\oracle\product\11.2.0\server)
          (PROGRAM = extproc)
        )
        )

 *(SID_DESC =
           (SID_NAME = XE)
           (ORACLE_HOME = C:\oraclexe\app\oracle\product\11.2.0\server)
         )*
    LISTENER =
      (DESCRIPTION_LIST =
        (DESCRIPTION =
          (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
          (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
        )
      )


    DEFAULT_SERVICE_LISTENER = (XE)
Run Code Online (Sandbox Code Playgroud)

更正了此错误,如下所示:

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
       (SID_NAME = XE)
       (ORACLE_HOME = C:\oraclexe\app\oracle\product\11.2.0\server)
     )
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = C:\oraclexe\app\oracle\product\11.2.0\server)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\oraclexe\app\oracle\product\11.2.0\server)
      (PROGRAM = extproc)
    )
    )
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
    )
  )


DEFAULT_SERVICE_LISTENER = (XE)
Run Code Online (Sandbox Code Playgroud)

停了和数据库 在此输入图像描述

手动停止侦听器OracleServiceXE和OracleXETNSListener,因为它没有通过转到控制面板\所有控制面板项\管理工具\服务自动停止.重新启动数据库,它就像一个魅力.


jet*_*ton 6

Oracle:精简型服务名称语法

仅 JDBC Thin 驱动程序支持 Thin 样式服务名称。语法是:

@//主机名:端口号/服务名

http://docs.oracle.com/cd/B28359_01/java.111/b31224/urls.htm#BEIDHCBA