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

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

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

sqlplus username/password@addressname[or host name]

我们已核实:

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

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


当前回答

在我的例子中,tnsnames中缺少SERVICE_NAME周围的圆括号。ora文件。

<DBNAME> =
  (DESCRIPTION =
    (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL=TCP)(HOST = nupark-cnvr-ora )(PORT=1521))
    )
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = <DBNAME> ***CLOSING ROUND BRACKET WAS MISSING HERE***
    )
  )

LISTENER_<DBNAME> =

  (ADDRESS = (PROTOCOL = TCP)(HOST = nupark-cnvr-ora)(PORT = 1521))

其他回答

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

我的问题解决了,用“服务名称”和正确的主机替换URL中的“sid”。

TNSLSNR上升,但数据库下降。

对于oracle新手来说,当连接被接受时,数据库可能会关闭是不明显的。

我必须手动启动数据库

su - oracle
export ORACLE_SID=XE
sqlplus sys as sysdba

然后在sql console中

startup

在我的情况下,我启动失败,但得到了另一个错误消息,并发现了一个问题的来源-我必须改变主机名,然后数据库自动启动再次发挥作用。

从服务启动OracleServiceXXX。我在Windows系统下使用msc。

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