我们有一个本地运行的应用程序,我们遇到了以下错误:

ORA-12514: TNS:监听器当前不知道所请求的服务 在连接描述符中

我已经使用正确解决的tnspring测试了连接 我尝试使用SQLPlus进行连接,但失败了,出现了与上面相同的错误。我在SQLPlus中使用了以下语法:

sqlplus username/password@addressname[or host name]

我们已核实:

服务器上的TNS Listener正在运行。 服务器上的Oracle本身正在运行。

我们不知道这个环境发生了什么变化。 还有什么可以测试的吗?


当前回答

我有一个案例,我使用DBMS,我必须完成一个数据库连接表单。

我把SID放入数据库字段,在下拉框中,在字段旁边,我有“服务名称”值而不是“SID”值。 (通常我不使用Oracle数据库,所以我没有意识到差异)

这就是我得到错误消息的原因。

其他回答

我知道这是一个老问题,但仍然没有答案。我花了一天的时间研究,但我找到了最简单的解决方案,至少在我的情况下(Windows 2008 R2上的Oracle 11.2),我想分享。

如果直接查看该错误,则表明侦听器不识别服务名称。但是它把服务名保存在哪里呢?在% ORACLE_HOME % \ \ ADMIN \ listener.ora网络

“SID_LIST”就是一个sid和服务名的列表,它们以一种可以复制或查找的格式配对。

我添加了问题服务名称,然后在Windows“服务”控制面板中,我对Oracle侦听器服务进行了“重新启动”。现在一切都好了。


例如,你的听众。Ora文件最初可能是这样的:

# listener.ora Network Configuration File: C:\app\oracle_user\product\12.1.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\app\oracle_user\product\12.1.0\dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:C:\app\oracle_user\product\12.1.0\dbhome_1\bin\oraclr12.dll")
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

... 为了让它识别orcl的服务名称,你可以将它更改为:

# listener.ora Network Configuration File: C:\app\oracle_user\product\12.1.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\app\oracle_user\product\12.1.0\dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:C:\app\oracle_user\product\12.1.0\dbhome_1\bin\oraclr12.dll")
    )
    (SID_DESC = 
        (GLOBAL_DBNAME = orcl)
        (ORACLE_HOME = C:\app\oracle_user\product\12.1.0\dbhome_1)
        (SID_NAME = orcl)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

我解决了这个问题在我的linux环境更新我的机器的IP在/etc/hosts文件。

您可以验证您的网络IP (inet end.):

$ifconfig

查看您的IP是否与/etc/hosts文件匹配:

$cat /etc/hosts

如果需要,编辑/etc/hosts文件:

$sudo gedit /etc/hosts

Bye.

对我来说很简单,我只需要在“Windows服务”中手动启动服务。MSC在CMD trompt)。 我的服务名称是:OracleServiceXXXXX。

在我的情况下,错误是由于监听器没有注册db的服务。我通过注册服务解决了这个问题。例子:

我在tnsnames.ora中的描述符:

LOCALDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = LOCALDB)
    )
  )

因此,我继续在侦听器中注册服务。奥拉手动:

SID_LIST_LISTENER =
    (SID_DESC =
      (GLOBAL_DBNAME = LOCALDB)
      (ORACLE_HOME = C:\Oracle\product\11.2.0\dbhome_1)
      (SID_NAME = LOCALDB)
    )

最后,通过命令重新启动监听器:

> lsnrctl stop
> lsnrctl start

完成了!

我有一个案例,我使用DBMS,我必须完成一个数据库连接表单。

我把SID放入数据库字段,在下拉框中,在字段旁边,我有“服务名称”值而不是“SID”值。 (通常我不使用Oracle数据库,所以我没有意识到差异)

这就是我得到错误消息的原因。