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

Ala*_*orm 12 oracle tns tnsnames connection-string

Borderline ServerFault问题,但我想先在这里尝试一下,因为我过去对Oracle的问题很满意.

我正在尝试从PHP连接到oracle数据库,我收到以下错误.

ORA-12505: TNS:listener does not currently know of SID given in connect descriptor
Run Code Online (Sandbox Code Playgroud)

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

我当前的问题是解决这个错误.我想回答的一个更大的问题是Oracle连接模型是如何工作的?

这是在我的本地Windows机器上运行的开发环境中,并且一直在运行.不幸的是,环境被移交给我(我没有设置它),谁的人没有设置它是不可用的帮我调试.

如果我在MySQL或PostgreSQL(我更熟悉的两个系统)中遇到类似的错误,我会检查以确保数据库进程正在运行,然后尝试使用用户名/密码/手动连接到数据库连接字符串.不幸的是,我不熟悉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)
    )
  )
Run Code Online (Sandbox Code Playgroud)

当我运行时,这不会反映在实例列表中

    LSNRCTL> services
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*las 8

TNS名称就像是服务实例的别名.在这方面,TNS监听器服务为您提供一种查找服务.如果您尝试通过TNS名称连接的实际服务无效,则该错误消息将失败.

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

%>lsnrctl services
Run Code Online (Sandbox Code Playgroud)

哪个应输出如下内容:

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))
Run Code Online (Sandbox Code Playgroud)

您能否发布相关的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)
    )
  )
Run Code Online (Sandbox Code Playgroud)