首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ORA-12514 TNS:侦听器当前不知道连接描述符中请求的服务

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

Stack Overflow用户
提问于 2012-05-28 23:07:05
回答 27查看 1.6M关注 0票数 277

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

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

我已经使用正确解析的TNSPing测试了连接,并且我尝试了SQLPlus来尝试连接,但失败了,出现了与上面相同的错误。我在SQLPlus中使用了以下语法

代码语言:javascript
复制
sqlplus username/password@addressname[or host name]

我们已核实:

  • 服务器上的TNS侦听器正在运行。服务器上的
  • Oracle本身正在运行。

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

EN

回答 27

Stack Overflow用户

回答已采纳

发布于 2013-04-17 07:36:56

我遇到了这个问题,修复方法是确保tnsnames.ora中的SERVICE_NAME是数据库中的有效服务名称。要查找有效的服务名,可以在oracle中使用以下查询:

代码语言:javascript
复制
select value from v$parameter where name='service_names'

一旦我将tnsnames.ora更新为:

代码语言:javascript
复制
TEST =
   (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = *<validhost>*)(PORT = *<validport>*))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = *<servicenamefromDB>*)
    )
)

然后我运行:

代码语言:javascript
复制
sqlplus user@TEST

成功!监听程序基本上是在告诉您,根据DB,无论您使用的是什么service_name,都不是有效的服务。

(*我从Win7客户端工作站到远程数据库运行sqlplus,并责怪DBA ;) *)

票数 255
EN

Stack Overflow用户

发布于 2014-03-25 20:13:31

我知道这是一个老问题,但仍然没有答案。我花了一天的时间研究,但我找到了最简单的解决方案,至少在我的案例中(Windows2008 R2上的Oracle11.2),我想分享一下。

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

"SID_LIST“只是SID和服务名称的列表,它们以您可以复制或查找的格式配对。

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

例如,您的listener.ora文件最初可能如下所示:

代码语言:javascript
复制
# 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的服务名称,您可以将其更改为:

代码语言:javascript
复制
# 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))
    )
  )
票数 62
EN

Stack Overflow用户

发布于 2017-06-01 07:39:02

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

我在tnsnames.ora中的描述符

代码语言:javascript
复制
LOCALDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = LOCALDB)
    )
  )

因此,我继续在listener.ora中手动注册服务:

代码语言:javascript
复制
SID_LIST_LISTENER =
    (SID_DESC =
      (GLOBAL_DBNAME = LOCALDB)
      (ORACLE_HOME = C:\Oracle\product\11.2.0\dbhome_1)
      (SID_NAME = LOCALDB)
    )

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

代码语言:javascript
复制
> lsnrctl stop
> lsnrctl start

完成了!

票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10786782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档