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

Posted

技术标签:

【中文标题】ORA-12505, TNS: 监听器当前不知道连接描述符中给出的 SID【英文标题】:ORA-12505, TNS:listener does not currently know of SID given in connect descriptor 【发布时间】:2013-08-12 16:54:19 【问题描述】:

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

【问题讨论】:

从对我有用的服务手动启动 OracleServiceXE。 【参考方案1】:

我通过更正我的 jdbc 字符串解决了这个问题。

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

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

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

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

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

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

【讨论】:

如果你使用 / 它是一个网络服务名称,如果你使用冒号它是一个 SID。 替换:由 / 在 Intellij 的数据库视图中为我工作,非常感谢!【参考方案2】:

有几件事会导致此问题,但在开始使用 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 / as sysdba

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

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

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

一旦你可以获得表单的连接

sqlplus 系统/系统密码@XE

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

【讨论】:

@Raj:我看不出你的编辑会给答案带来什么,所以我把它删除了。如果您想为某个问题做出大量贡献,请发布您自己的答案,而不是编辑其他人的答案。 @LukeWoodward 我收到此错误SP2-0734: unknown command beginning "system/ora..." - rest of line ignored. 全部 3 @qtpseleniumSupport:该消息表明您在 SQL*Plus 中并且您输入了system/ora... 行(或者 SQL*Plus 从您告诉它读取的文件中读取了该行)。我上面给出的命令行旨在从命令提示符/shell/终端窗口中使用。如果您已经在运行 SQL*Plus,请将 sqlplus 替换为 connect "数据库未注册到监听器,例如因为数据库在监听器之前启动。" - 就是这样,谢谢! 在 docker 上使用 OracleDB,我尝试通过 IntelliJ Data Sources and Drivers UI 连接到它。没有任何效果。阅读您的答案后,我连接到 docker 容器本身 (docker exec -it &lt;docker_id&gt; bash) 并使用了立即起作用的sqlplus / as sysdba。谢谢!【参考方案3】:

我也遇到了同样的错误,但是当尝试所有三个都失败了。 如果上述三个都失败了。如果发现服务(在我的情况下为 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

这应该可以工作...

【讨论】:

你做到了,伙计!设置local_listener 后,orcl 监听器现在显示在lsnrctl 中。谢谢一百万! 这让我的系统正常工作,但请注意我运行了以下命令:ALTER SYSTEM set local-listener=XE; 当我输入:'alter system set local_listener = '(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))' scope = both;'它返回一个错误:ORA-65040: operation not allowed from within a pluggable database 这是什么意思?无法配置 JDBC:/ 两个投票最多的答案都有帮助,但这个帮助更多。看起来我没有 127.0.0.1 作为侦听器地址(我有一个带有我 PC 本地名称的地址)。所以通过添加这个新的,它开始工作了 alter system set local_listener = ... 为我工作。【参考方案4】:

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

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

【讨论】:

我遇到了同样的问题,但运行 OracleServiceXE。因此,重新启动 OracleServiceXE 服务对我有用。不知道为什么?! 在寻找 OracleServiceXE 时,请记住 XE 对应于数据库 SID,因此请确保您正在寻找正确的服务,OracleService[SID]【参考方案5】:

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

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

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

【讨论】:

谢谢,很有用,急需这个【参考方案6】:

我找到了导致此异常的一些原因。它们是

1)默认数据库XE的名称。所以url将是“jdbc:oracle:thin:@localhost:1521:XE”。

2) 确保 OracleServiceXE、OracleXETNSListener 正在运行。它将位于 Control Panel\All Control Panel Items\Administrative Tools\Services

【讨论】:

【参考方案7】:

我通过更正我的 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");

【讨论】:

【参考方案9】:

遇到类似错误,上述任何解决方案均无济于事。 listner.ora 文件中存在问题。我错误地在SID_LIST 中添加了SID,见下文(星号之间的部分*)。

 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,因为它没有通过转到控制面板\所有控制面板项\管理工具\服务自动停止。重新启动数据库,它就像一个魅力。

【讨论】:

【参考方案10】:

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

【讨论】:

【参考方案11】:

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

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

【讨论】:

【参考方案12】:

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

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

@//host_name:port_number/service_name

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

【讨论】:

【参考方案13】:

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

【讨论】:

【参考方案14】:

我通过在我的 TNSNAMES.ora 文件中将“SID”更改为“SERVICE_NAME”解决了这个问题。

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

干杯

【讨论】:

【参考方案15】:

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

【讨论】:

【参考方案16】:

我遇到了同样的问题,所以为了解决这个问题,我首先使用 netca 重新配置了我的监听器,然后我使用 dbca 删除了我的旧数据库,即 ORCL,然后我再次使用 dbca 创建了新数据库。 /p>

【讨论】:

【参考方案17】:

当您浏览start-&gt;run-&gt;services.msc 时,请检查OracleServiceXEOracleXETNSListener 的状态是否已启动。

就我而言,只有OracleXETNSListener 启动但OracleServiceXE 没有启动,当我从right clicking -&gt; start 启动并检查连接是否为我工作时

【讨论】:

【参考方案18】:

如果你使用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>`

【讨论】:

【参考方案19】:

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");

(删除@)

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

【讨论】:

【参考方案20】:

通过在主机中执行 tnsping 和实例名称来检查。它会给你 tns 的描述,并且大部分时间主机名都是不同的,这是不匹配的。

我同样解决了我的问题

在 Unix 机器上 $ tnsping (回车)

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

【讨论】:

【参考方案21】:

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

网址:

jdbc:oracle:thin:@111.111.111.111:1111:xe

没用。

网址:

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

有效。

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

【讨论】:

【参考方案22】:

当我尝试使用 SQL 开发人员连接到 oracle DB 时,我收到此错误 ORA-12505,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.

【讨论】:

【参考方案23】:

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

更改为负载平衡的 db url 并且它起作用了。

【讨论】:

我们建议使用完全限定的连接字符串 URL,如下所示 jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(HOST=myhost)(PORT=1521)(PROTOCOL=tcp))(CONNECT_DATA =(SERVICE_NAME=myorcldbservicename)))【参考方案24】:

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

【讨论】:

【参考方案25】:

除了运行服务(OracleServiceXE、OracleXETNSListener)之外,您的防病毒软件/防火墙仍有可能阻止它们。只要确保他们没有被阻止。

【讨论】:

【参考方案26】:

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

【讨论】:

【参考方案27】:

我的 oracle 停止工作,我收到了这个错误。我重新启动了机器并尝试了上述解决方案。最终,我打开了组件服务并重新启动了 oracle 服务,一切都开始工作了。希望这对某人有所帮助。

【讨论】:

【参考方案28】:

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

对我来说简单的解决方法是将“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】:

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

【讨论】:

【参考方案30】:

@Luke Woodward 的回答有助于确定我的 XE 没有连接。 连接到 *** 时遇到问题。我在 Windows 11 上使用全新的本地 Oracle 21c。 listener.oratnsnames.ora 文件使用我的 PC 名称“ERIK-PC”,如下所示:

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = ERIK-PC)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

我只需要将ERIK-PC 更改为localhost。 此thread 中的更多信息。 顺便说一句,我使用的是 Oracle 21c,从 18c 开始,*.ora 文件位于 installationfolder\homes\OraDB21Home1\network\admin\*.ora 下 保存您的更改并使用特权 Windows shell 重新启动侦听器:

lsnrctl stop
lsnrctl start

【讨论】:

以上是关于ORA-12505, TNS: 监听器当前不知道连接描述符中给出的 SID的主要内容,如果未能解决你的问题,请参考以下文章

ORA-12505: TNS: 监听程序当前无法识别连接描述符中所给出的SID等错误解决方法

Oracle SQL Developer 12505 网络更改后的错误

转jbdc程序启动报错:ORA-12505;PL/SQL却可以登录的解决方法

连接oracle数据库出现:ORA-12505,TNS:listener does not currently know of SID given in connect descriptor(示例代码

ORA-12505, TNS:listener does not currently know of SID given in connect descriptor

ORA-12505 错误解决