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

时间:2013-08-12 16:54:20

标签: 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

30 个答案:

答案 0 :(得分:147)

我通过更正我的jdbc字符串来修复此问题。

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

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

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

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

(注意:1521XE之间应为/

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

答案 1 :(得分:83)

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

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

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

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

“服务”管理单元中正在运行哪些Oracle服务? (从“控制面板”&gt;“管理工具”&gt;“服务”中打开,或者只需“开始”&gt;“运行”&gt; 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组。在控制面板中执行此操作&gt;计算机管理&gt;本地用户和组。

一旦你能获得表格的连接

sqlplus system/system-password@XE

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

答案 2 :(得分:36)

我也得到了同样的错误,但是当他们尝试了所有这三个失败时。  如果以上三个失败。如果您发现服务(我的情况下为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

这应该可行......

答案 3 :(得分:28)

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

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

答案 4 :(得分:10)

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

1)默认情况下数据库XE的名称。所以url将是&#34; jdbc:oracle:thin:@localhost:1521:XE &#34;。

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

答案 5 :(得分: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名称错误。

答案 6 :(得分:7)

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

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

答案 7 :(得分: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)

停止并且数据库enter image description here

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

答案 8 :(得分:4)

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

enter image description here

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

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

答案 9 :(得分:4)

甲骨文: 精简式服务名称语法

只有JDBC Thin驱动程序支持精简式服务名称。语法是:

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

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

答案 10 :(得分:4)

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

答案 11 :(得分:4)

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

结果证明是我的问题,在/ etc / hosts中添加主机名和IP地址解决了这个问题。

答案 12 :(得分:2)

我有同样的问题所以要解决这个问题我首先使用netca重新配置我的监听器之后我使用dbca删除了我的旧数据库,这是ORCL然后我再次创建了新的数据库dbca

答案 13 :(得分:2)

我遇到了同样的问题,并通过重启OracleServiceXE服务解决了这个问题。转到Services.msc,然后验证“OracleServiceXE”服务是否已启动并正在运行

答案 14 :(得分:2)

如果您使用的是Oracle Express Edition,则应该有此URL

  

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

我在pom.xml中遇到了与liquibase配置插件类似的问题。我改变了配置:

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

答案 15 :(得分:2)

我也遇到了同样的问题。我使用VMware在Windows XP操作系统中安装了Oracle Express版10g,并且工作正常。由于在10g提供的SQL实用程序中键入SQL查询非常尴尬,因为我习惯于与SQL开发人员合作,所以我在XP中安装了32位SQL开发人员并尝试连接到我的数据库SID“XE”。但连接失败并出现错误-ORA-12505 TNS监听器当前不知道连接描述符中给出的SID。我在海上是关于这个问题是如何发生的,因为它与SQL实用程序一起正常工作,我也使用相同的方法创建了一些Informatica映射。在公共论坛上ping了“lsnrctl”的状态之后,我确实浏览了很多关于这些东西并应用了提供给我的建议,但无济于事。然而,今天早上我尝试再次创建一个新连接,而Voila,它没有任何问题。我猜是在阅读了几篇帖子之后,有时听众会在数据库连接之前听一听(请原谅我粗略参考,因为我是新手)但是我建议重新启动机器并再次检查。

答案 16 :(得分:1)

我通过更改&#34; SID &#34;修复了此问题。到&#34; SERVICE_NAME &#34;在我的TNSNAMES.ora文件中。

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

干杯

答案 17 :(得分:1)

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

我得到的错误:

java.sql.SQLException:侦听器拒绝连接并出现以下错误: ORA-12505,TNS:监听器当前不知道连接描述符中给出的SID 客户端使用的连接描述符是: 本地主机:1521:XE

我是如何解决的:

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

(删除@)

不知道为什么,但现在正在努力......

答案 18 :(得分:1)

我在SQL Workbench中遇到过类似的问题。

URL:

JDBC:预言:瘦:@ 111.111.111.111:1111:的 XE

不起作用。

URL:

JDBC:预言:瘦:@ 111.111.111.111:1111:的 ASDB

作品。

这有助于我解决具体情况。我担心,这可能存在许多不同解决方案的其他原因。

答案 19 :(得分:1)

请在浏览OracleServiceXE时检查状态已开始的OracleXETNSListenerstart->run->services.msc

就我的情况而言,只有OracleXETNSListener已启动但OracleServiceXE未启动,当我从right clicking -> start开始并检查了它为我工作的连接时

答案 20 :(得分:1)

在弄乱了一些cmd之后突然得到同样的问题。原来,ORACLE SERVICE XE已停止运行。花了2秒钟从管理工具重新启动它。 TNX!

答案 21 :(得分:1)

通过在主机中执行tnsping和实例名称进行检查。它会给你tns解释,所有大部分时间主机名都不同,不匹配。

我同样解决了我的问题

在Unix机器上 $ tnsping(回车)

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

答案 22 :(得分:0)

在我的情况下没有工作,最后我重新启动了我的oracle和TNS监听器,一切正常。挣扎了2天。

答案 23 :(得分:0)

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

更改为加载平衡数据库网址并且它可以正常工作。

答案 24 :(得分:0)

我收到此错误 ORA-12505,当我尝试使用SQL Developer连接到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.

答案 25 :(得分:0)

除了在运行服务(OracleServiceXE,OracleXETNSListener)上,您的防病毒软件/防火墙可能仍会阻止它们。只要确保它们未被阻止即可。enter image description here

答案 26 :(得分:0)

我只是通过重新启动/启动服务中的oracleService来修复它

答案 27 :(得分:0)

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

答案 28 :(得分: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 

解决了我的问题。

答案 29 :(得分:0)

我遇到此问题,因为我确实在任务管理器中将任务杀死为“ Oracle”任务。 要修复它,您需要打开cmd->输入:services.msc->包含所有服务的窗口将打开->查找服务“ OracleServiceXE”->右键单击:开始。