13

Borderline ServerFault 问题,但我想我会先在这里尝试,因为我过去曾遇到过 Oracle 问题。

我正在尝试从 PHP 连接到 Oracle 数据库,但出现以下错误。

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

这是 PHP 报告的错误,也是 Oracle 的 listener.log 中显示的错误。

我的直接问题是修复此错误。我想回答的更大的问题是 Oracle 连接模型是如何工作的?

这是在我的本地 Windows 机器上运行的开发环境中,并且一直工作到现在。不幸的是,环境交给了我(我没有设置它)并且设置它的人无法帮助我调试它。

如果我在使用 MySQL 或 PostgreSQL(我更熟悉的两个系统)时遇到类似的错误,我会检查以确保数据库进程正在运行,然后尝试使用用户名/密码 / 手动连接到数据库连接字符串。不幸的是,我不熟悉 Windows 上的 Oracle 工具(SQL Developer 除外),并且我不知道 Oracle 上下文中的 TNS:listener 或 SID 是什么(我有模糊的想法,但模糊的想法很少有帮助)你正在调试这样的东西)

任何一般性建议将不胜感激。

每个评论的更新:

在我的 tnsnames.ora 文件中有许多整体,相关条目是

OBS2 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = steel-ae39650)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = OBS2)
    )
  )

这没有反映在我运行时的实例列表中

    LSNRCTL> services

所以我想我的下一个问题是,如何尝试手动启动 OBS2 实例?

4

3 回答 3

9

TNS 名称就像您的服务实例的别名。在这方面,TNS 侦听器服务为您充当一种查找服务。如果您尝试通过 TNS 名称连接的实际服务无效,它将失败并显示该错误消息。

然后,您可以使用命令行工具测试 TNS 侦听器是否正确看到服务:

%>lsnrctl services

应该输出如下内容:

Service "myservice" has 1 instance(s).
  Instance "myinstance", status READY, has 1 handler(s) for this service...
    Handler(s):
      "D000" established:0 refused:0 current:0 max:1002 state:ready
         DISPATCHER <machine: LOCALHOST, pid: 12345>
         (ADDRESS=(PROTOCOL=tcp)(HOST=LOCALHOST)(PORT=6789))

您能否发布相关的 TNS 条目(在tnsnames.ora文件中)?它位于 ORAHOME\client 或 db\ADMIN\NETWORK。如果您同时拥有客户端和服务器,请确保tnsnames.ora文件的两个副本都具有正确的值,以确保安全。

下面是一个tnsnames.ora名为“mydb”的正确 TNS 名称定义示例:

myDbAlias =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 12345)(QUEUESIZE = 100))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = myservice)
    )
  )
于 2010-01-25T18:44:33.567 回答
4

只是想补充一下,因为我最近遇到了一个类似的连接问题,这让我抓狂,直到我弄清楚发生了什么。

首先,关键字 SID 和 SERVICE_NAME 并不完全相同。这是我的第一个错误假设。在许多环境中,您可以交换 SID 和 SERVICE_NAME,但并非总是如此,这取决于。

也就是说,您的错误解决了问题:您在连接字符串中指定了SID ,而不是 tnsnames 成功使用的SERVICE_NAME

因此,如果您在代码中指定连接字符串,请尝试在连接字符串中使用 SERVICE_NAME 关键字(*或者,如果您已经使用 SERVICE_NAME 并且无法连接,请尝试使用 SID 关键字*)。

我知道的答案过于简单,但很容易尝试,可能会让一些人头疼。

希望有帮助。

于 2012-12-28T13:37:03.720 回答
1

Mike Atlas' answer is fairly comprehensive, but note that you can connect to 10g (or later) DBs which don't have a published tnsname using [//]host_name[:port][/service_name]

HTH

C.

于 2010-01-25T18:55:12.073 回答