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

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

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

sqlplus username/password@addressname[or host name]

我们已核实:

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

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


当前回答

这真的应该是对Brad Rippe[1]的回答的一个评论,但是,唉,没有足够的代表性。这个回答让我走了90%的路。在我的例子中,数据库的安装和配置将条目放在tnsnames中。ora文件用于我正在运行的数据库。首先,我能够通过设置环境变量(Windows)连接到数据库:

set ORACLE_SID=mydatabase
set ORACLE_HOME=C:\Oracle\product\11.2.0\dbhome_1

然后连接使用

sqlplus / as sysdba

接下来,运行Brad Rippe回答的命令:

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

说明名字并不完全匹配。使用Oracle的数据库配置助手创建的条目最初是:

MYDATABASE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = mylaptop.mydomain.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = mydatabase.mydomain.com)
    )
  ) 

查询中的服务名称只是mydatabase,而不是mydatabase.mydomain.com。我编辑了tnsnames。Ora文件只有基本名称,没有域名部分,所以它们看起来像这样:

MYDATABASE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = mylaptop.mydomain.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = mydatabase)
    )
  ) 

我重新启动了TNS监听器服务(我经常使用lsnrctl stop和lsnrctl start从管理员命令窗口[或Windows Powershell],而不是服务控制面板,但两者都工作。)在那之后,我能够与人沟通。 [1]: https://stackoverflow.com/users/979521/brad-rippe

其他回答

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

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

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

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

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

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

我有这个问题,修复是确保在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;) *)

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

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

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

我只需要替换我的连接字符串

来自:

jdbc:oracle:thin:@localhost:1521:xe

To:

jdbc:oracle:thin:@localhost:1521:orcl

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