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


153

我已经在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

1
从服务手动启动OracleServiceXE对我有用。

Answers:


183

我通过更正jdbc字符串来解决此问题。

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

jdbc:oracle:thin:@myserver:1521/XE

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

jdbc:oracle:thin:@myserver:1521:XE

(注意:1521和之间XE应为/

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


53
如果使用/,则为网络服务名称;如果使用冒号,则为SID。
eckes

89

可能会导致此问题的原因有很多,但是在开始使用JDBC之前,需要确保可以使用SQL * Plus连接到数据库。如果您不熟悉SQL * Plus,它是一个用于连接到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系统/ 系统密码 @XE
sqlplus系统/ 系统密码
sqlplus /作为sysdba

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

这三个中的第一个通过TNS侦听器连接,但是后两个不通过侦听器直接连接到数据库,并且仅当您与数据库位于同一台计算机上时才起作用。如果第一个失败,但其他两个成功,则JDBC连接也将失败。如果是这样,请使用其他两个数据库之一连接到数据库并运行ALTER SYSTEM REGISTER。然后从SQL * Plus退出并再次尝试第一种形式。

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

一旦您可以获得表格的联系

sqlplus系统/ 系统密码 @XE

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


3
@Raj:我看不到您的修改能带来什么答案,因此已将其删除。如果您想为一个问题做出很大贡献,请发布您自己的答案,而不要编辑其他人的答案。
路加·伍德沃德

@LukeWoodward我SP2-0734: unknown command beginning "system/ora..." - rest of line ignored. 在所有3处都收到此错误
vaibhavcool20

1
@qtpseleniumSupport:该消息表明您使用的是SQL * Plus,并且您输入了该行system/ora...(或者SQL * Plus从告诉它读取的文件中读取了该行)。我上面给出的命令行旨在在命令提示符/ shell /终端窗口中使用。如果您已经在运行SQL * Plus,请替换sqlplusconnect
卢克·伍德沃德

“数据库尚未在侦听器中注册,例如,因为数据库是在侦听器之前启动的。” -就是这样,谢谢!
Ursache

47

我也遇到了同样的错误,但尝试时所有三个都失败了。如果以上三个均失败,请在发现服务(本例中为XE)丢失的情况下尝试使用LSNRCTL状态,请尝试以下操作

sqlplus /nolog
conn  system
alter system register;  
exit  
lsnrctl status  

现在您可以看到该服务,
即使看不到也可以尝试一下

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

这可能应该工作...


2
你做到了,伙计!设置后local_listener,orcl侦听器现在显示在中lsnrctl。太感谢了!
ass 2015年

这使我的系统正常工作,但请注意,我运行了以下命令:ALTER SYSTEM set local-listener = XE;
丹尼尔·威廉姆斯

当我键入时:'更改系统设置local_listener ='(ADDRESS =(PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))'范围=两者;' 返回错误:ORA-65040: operation not allowed from within a pluggable database是什么意思?无法配置JDBC:/
Alg_D

1
投票最多的两个答案都有用,但是这个答案更有用。看来我没有127.0.0.1作为侦听器地址(我有一个使用PC本地名称的地址)。因此,通过添加这一新功能,它开始工作
johnbr '16

alter system set local_listener = ... 为我工作。
Ben Asmussen,2013年

31

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

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


我遇到了同样的问题,但是运行OracleServiceXE。因此,重新启动OracleServiceXE服务对我来说很有效。不知道为什么吗?
Hamedz

在寻找OracleServiceXE时,请记住XE对应于数据库SID,因此请确保您正在寻找正确的服务,OracleService [SID]
Sandoval0992

10

我发现了此异常的一些原因。

1)默认情况下,数据库XE的名称。因此,URL为“ jdbc:oracle:thin:@localhost:1521:XE ”。

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


8

我通过更正JDBC代码解决了这个问题。

正确的JDBC字符串应为...

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

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

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

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


以我conection = DriverManager.getConnection ("jdbc:oracle:thin:@localhost:1521:orcl","system","ishantyagi");为例。
普兰·库玛·萨卡

8

使用以下代码时,我的问题已解决:

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

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)

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

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)

停止和数据库 在此处输入图片说明

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


4

我最初来这里遇到同样的问题。我已经在Windows 8(64位)上安装了Oracle 12c,但此后我已经在命令行上通过“ TNSPING xe”解决了该问题...如果未建立连接或未找到名称,请尝试数据库名称,在我的情况下,它再次是'orcl'...'TNSPING orcl',如果它能ping通,那么在这种情况下,您需要将SID更改为'orcl'(或您使用的任何数据库名称)...


4

我尚未广泛讨论的一种可能性是在主机本身上解析主机名可能存在问题。如果/ etc / hosts中没有$(hostname)项,则Oracle侦听器会感到困惑并且不会出现。

原来这是我的问题,在/ etc / hosts中添加主机名和IP地址解决了该问题。



3

如果您在Oracle SQL Developer中具有有效的连接,请使用连接菜单上的信息来构建URL,如下图所示:

在此处输入图片说明

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

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


2

我也面临同样的问题。我已经使用VMware在Windows XP OS中安装了Oracle Express 10g,并且运行良好。由于在10g提供的SQL实用工具中键入SQL查询非常尴尬,并且由于我习惯于使用SQL开发人员,因此我在XP中安装了32位SQL开发人员,并尝试连接到我的DB SID“ XE”。但是连接失败,并报错-ORA-12505 TNS侦听器当前不知道连接描述符中提供的SID。由于该问题在SQL实用程序中正常运行,因此我一直在研究该问题的发生方式,并且我还使用该实用程序创建了一些Informatica映射。到目前为止,我确实浏览了很多有关此内容的内容,并在公共论坛上对“ lsnrctl”的状态进行了查验后应用了提供给我的建议,但无济于事。但是,今天早上我尝试再次创建一个新的连接,和Voila,它没有任何问题。我猜想在读了几篇文章后,有时收听者会在数据库连接之前或某些东西之前收听(请原谅我的粗略参考,因为我是新手),但我建议只是重新启动机器并再次检查。


2

我有同样的问题,因此要解决此问题,请先使用重新配置我的侦听netcadbca,然后再使用删除我的旧数据库(即ORCL),然后再次使用创建新数据库。dbca



2

我通过将“ SID ” 更改为“ SERVICE_NAME ”来解决此问题在TNSNAMES.ora文件中将 ”。

请查看您的数据库是否要求SID或SERVICE_NAME。

干杯


2

如果使用Oracle Express Edition,则应具有此URL

jdbc:oracle:thin:@localhost:1521:xe或jdbc:oracle:thin:@localhost:1521 / XE

我在pom.xml中的liquibase config插件有类似的问题。我更改了配置:

`<configuration>
   <driver>oracle.jdbc.OracleDriver</driver>
   <url>jdbc:oracle:thin:@localhost:1521:xe</url>
   <defaultSchemaName></defaultSchemaName>
   <username>****</username>
   <password>****</password>
</configuration>`

2

连接con = DriverManager.getConnection(“ jdbc:oracle:thin:@localhost:1521:xe”,“ scott”,“ tiger”);

我得到的错误:

java.sql.SQLException:侦听器拒绝连接,并出现以下错误:ORA-12505,TNS:listener当前不知道连接描述符中给出的SID客户端使用的连接描述符为:localhost:1521:xe

我如何解决的:

连接con = DriverManager.getConnection(“ jdbc:oracle:thin:localhost:1521:xe”,“ scott”,“ tiger”);

(去掉 @)

不知道为什么,但是现在可以正常工作了...


1

通过在主机中执行tnsping和实例名称进行检查。它会给您tns解密,并且大多数时候主机名都是不匹配的。

我也解决我的问题

在Unix机器中$ tnsping(Enter)

它给了我完整的tns描述,在这里我发现主机名是不同的.. :)


1

在浏览时,请同时检查两者OracleServiceXEOracleXETNSListener启动状态start->run->services.msc

对于我来说,只有OracleXETNSListener在启动但未OracleServiceXE启动的情况下,我才开始right clicking -> start检查连接是否对我有效


1

我在SQL Workbench中有类似的问题。

网址:

jdbc:oracle:thin:@ 111.111.111.111:1111: XE

不起作用。

网址:

jdbc:oracle:thin:@ 111.111.111.111:1111: 111.111.111.111:1111:asdb

作品。

这对我的具体情况有帮助。恐怕,采用其他解决方案可能会存在许多其他原因。


0

发生了类似的问题。问题突然开始发生-我们有负载平衡的数据库连接URL,但是在jdbc连接中,我直接指向单个数据库。

更改为负载平衡的数据库URL,它可以正常工作。


2
我们建议使用完全限定的连接字符串URL,如jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS =(HOST = myhost)(PORT = 1521)(PROTOCOL = tcp))(CONNECT_DATA =(SERVICE_NAME = myorcldbservicename))))
Nirmala 2015年

0

就我而言,还没有解决,最后我重新启动了oracle和TNS侦听器,一切正常。挣扎了2天。


0

我收到此错误ORA-12505,当我尝试使用SQL开发人员连接到oracle DB时,TNS:listener当前不知道连接描述符中给出的SID

所使用的JDBC字符串为jdbc:oracle:thin:@myserver:1521 / XE,显然正确的一项和两项必需的oracle服务OracleServiceXE,OracleXETNSListener 已启动并正在运行

我解决此问题的方式(在Windows 10中)

 1. Open run command.
 2. Type services.msc 
 3. Find services with name OracleServiceXE and OracleXETNSListener in the list.
 4. Restart OracleServiceXE service first. After completing the restart try restarting OracleXETNSListener service.

0

除了在运行服务(OracleServiceXE,OracleXETNSListener)上,您的防病毒软件/防火墙仍有可能仍然阻止它们。只要确保它们未被阻止即可。在此处输入图片说明



0

我的甲骨文停止工作,并且出现此错误。我重新启动计算机,并尝试了上述解决方案。最终,我打开了组件服务并重新启动了oracle服务,所有这些都开始工作。希望这对某人有帮助。


0

我只是错误地创建了数据库链接。

对我来说,简单的解决方法是将“ SID”更改为SERVICE_NAME

CREATE DATABASE LINK my_db_link
CONNECT TO myUser IDENTIFIED BY myPassword
USING
'
(
    DESCRIPTION=
    (
        ADDRESS=
        (PROTOCOL=TCP)
        (HOST=host-name-heren)
        (PORT=1521)
    )
    (CONNECT_DATA=(SID=theNameOfTheDatabase))
)';

改变中

SID=theNameOfTheDatabase

SERVICE_NAME=theNameOfTheDatabase 

解决了我的问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.