什么是TNS:Oracle上下文中的监听器?

时间:2010-01-25 18:36:19

标签: oracle connection-string tnsnames tns

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(我更熟悉的两个系统)中遇到类似的错误,我会检查以确保数据库进程正在运行,然后尝试使用用户名手动连接到数据库/ password /连接字符串。不幸的是,我不熟悉Windows上的Oracle工具(除了SQL Developer),我不知道什么是TNS:监听器或SID在Oracle的上下文中(我有一些模糊的想法,但模糊的想法很少有帮助你正在调试这样的东西)

任何一般性建议都将受到赞赏。

每条评论更新:

我的tnsnames.ora文件中有很多内容,相关条目是

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

当我运行

时,这不会反映在实例列表中
    LSNRCTL> services

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

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

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

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

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

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

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

希望有所帮助。

答案 2 :(得分:1)

Mike Atlas的答案相当全面,但请注意,您可以使用[//] host_name [:port] [/ service_name]

连接到没有已发布的tnsname的10g(或更高版本)数据库

HTH

下进行。