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

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

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

sqlplus username/password@addressname[or host name]

我们已核实:

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

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


当前回答

我在Windows server 2008 R2和Oracle 11g上遇到了这个问题

进入网络管理器>监听>从组合框中选择数据库服务>“全局数据库名称”必须与“SID”相同,“Oracle主目录”必须正确。

如果没有数据库服务条目,请创建一个并设置正确的global database, sid和oracle home。

其他回答

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

select value from v$parameter where name='service_names'

有一次我更新了tnsnames。奥拉:

TEST =
   (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = *<validhost>*)(PORT = *<validport>*))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = *<servicenamefromDB>*)
    )
)

然后我就跑:

sqlplus user@TEST

成功! 监听器基本上是在告诉你,不管你使用的是什么service_name,根据DB,都不是一个有效的服务。

(*我从Win7客户端工作站运行sqlplus到远程DB,责怪dba;) *)

我也遇到过同样的问题,花了3天时间才把它挖出来。

发生这种情况是因为您错误的TNS服务条目。

首先检查是否能够使用sql > sqlplus sys@orastand作为sysdba (orastand是一个备用数据库)从主数据库连接到备用数据库。

如果您无法连接,那么这是与服务的问题。更正主端TNS文件中服务名称的填写。

用同样的方法检查备用数据库。如果需要,也可以在这里进行更改。

确保log_archive_dest_2参数具有正确的服务名称。

当应用程序为每个数据库交互建立新连接或连接未正确关闭时,可能会发生此错误。监视和确认这一点的免费工具之一是Oracle Sql developer(尽管这不是您可以用来监视DB会话的唯一工具)。

您可以从oracle网站Sql Developer下载该工具

下面是如何监控你的会话的截图。(如果您在看到ORA-12514错误时看到应用程序用户堆积了许多会话,那么这很好地表明您可能有连接池问题)。

我得到了同样的错误,因为指定的远程SID是错误的:

 > sqlplus $DATASOURCE_USERNAME/$DATASOURCE_PASSWORD@$DB_SERVER_URL/$REMOTE_SID 

我查询了系统数据库:

Select * from global_name;

找到了我的远程SID(“XE”)。

这样我就可以毫无问题地连接了。

在我的情况下,错误是由于监听器没有注册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

完成了!