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

Jac*_*ues 206 oracle sqlplus oracle11g ora-12514 tnsping

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

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

我已经测试了TNSPing正确解析的连接,我试图SQLPlus尝试连接,但失败的错误与上面相同.我用这个语法SQLPlus:

sqlplus username/password@addressname[or host name]
Run Code Online (Sandbox Code Playgroud)

我们已经证实:

  • 服务器上的TNS监听器正在运行.
  • Oracle本身在服务器上运行.

我们不知道对此环境所做的任何更改.还有其他我们可以测试的吗?

Bra*_*ppe 190

我有这个问题,并修复是确保在tnsnames.oraSERVICE_NAME在数据库中,一个有效的服务名称.要查找有效的服务名称,可以在oracle中使用以下查询:

select value from v$parameter where name='service_names'
Run Code Online (Sandbox Code Playgroud)

一旦我更新tnsnames.ora到:

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

然后我跑了:

sqlplus user@TEST
Run Code Online (Sandbox Code Playgroud)

成功!监听器基本上告诉您,根据数据库,您使用的任何service_name都不是有效的服务.

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

  • 如果我甚至无法连接到它,我该如何查询数据库? (165认同)
  • ORA-00942:表或视图不存在 (5认同)
  • 在 win7 上,%ORACLE_HOME%\NETWORK\ADMIN\tnsnames.ora (2认同)
  • 您可以直接通过 ssh 连接到数据库服务器并从那里运行 sqlplus 吗? (2认同)
  • 当多个客户端/服务器安装在或曾经安装在同一台计算机上时,情况可能并非如此。(tnsping 输出它使用的目录的位置) - 就我而言,该目录中的listener.ora包含与我已卸载的旧数据库实例有关的信息 - 快速而肮脏的方法是从复制listener.ora的全部内容我当前安装的 Oracle Express,到侦听器似乎正在检查的其他目录(我想我通过注册表或其他东西更改了它,并且它优先于 ORACLE_HOME (?)) (2认同)
  • @isabellemartz /sf/ask/755074771/#30861690 (2认同)
  • [这里](https://www.youtube.com/watch?v=PIlY07mvrYA) 在查看了每个答案后为我工作 (2认同)
  • 多谢。即使 11 年后它现在仍然有效。哇。我将它用于 Windows 11 上的 Oracle XE (21)。那些想要尝试此命令的人(为了了解该服务,因为大多数数据库客户端将其默认为 ORCL - 在我的情况下是 XE)。打开命令提示符并运行此命令“C:\Windows\System32&gt;sqlplus / AS sysdba”,然后此命令从 v$parameter 中选择值,其中 name='service_names' 。它应该为您提供服务名称。 (2认同)

小智 36

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

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

"SID_LIST"就是这样,一个SID和服务名称列表以您可以复制或查找的格式配对.

我添加了问题服务名称,然后在Windows"服务"控制面板中,我在Oracle侦听器服务上执行了"重新启动".现在一切都很好.


例如,您的listener.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))
    )
  )
Run Code Online (Sandbox Code Playgroud)

...要使其识别服务名称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))
    )
  )
Run Code Online (Sandbox Code Playgroud)

  • 需要使用`listener.ora`如何存储名称的语法来更新此答案.我甚至没有`listener.ora`文件.我也在运行SQL Developer的客户端工作站上,并在我收到错误时尝试创建数据库链接.我没有要重新启动的Oracle Listener服务. (3认同)

sur*_*all 13

对于那些使用 spring-boot 和 jdbc 进行连接的人。在 application.properties 中写入 jdbcUrl 时必须小心

在数据库连接中使用 SID - source.datasource.jdbcUrl = jdbc:oracle:thin:@[HOST][:PORT]:SID

在数据库连接中使用服务名称 globe.datasource.jdbcUrl = jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE

这对我有用:)


小智 12

我在Windows Server 2008 R2Oracle 11g上遇到过这个问题

转到网络管理器>监听器>从combox选择数据库服务>"全局数据库名称"必须与"SID"相同,"Oracle主目录"必须正确.

如果您没有任何数据库服务条目,请创建一个并设置正确的全局数据库sid和oracle home.


man*_*nix 10

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

我的描述在tnsnames.ora:

LOCALDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = LOCALDB)
    )
  )
Run Code Online (Sandbox Code Playgroud)

所以,我继续listener.ora手动注册服务:

SID_LIST_LISTENER =
    (SID_DESC =
      (GLOBAL_DBNAME = LOCALDB)
      (ORACLE_HOME = C:\Oracle\product\11.2.0\dbhome_1)
      (SID_NAME = LOCALDB)
    )
Run Code Online (Sandbox Code Playgroud)

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

> lsnrctl stop
> lsnrctl start
Run Code Online (Sandbox Code Playgroud)

完成!


小智 7

从services.msc启动OracleServiceXXX在Windows中为我工作.


Cap*_*rn1 6

这真的应该是对Brad Rippe回答的评论,但可惜,代表不够。这个答案让我完成了 90% 的工作。就我而言,数据库的安装和配置将条目放入我正在运行的数据库的 tnsnames.ora 文件中。首先,我能够通过设置环境变量(Windows)连接到数据库:

set ORACLE_SID=mydatabase
set ORACLE_HOME=C:\Oracle\product\11.2.0\dbhome_1
Run Code Online (Sandbox Code Playgroud)

然后使用连接

sqlplus / as sysdba
Run Code Online (Sandbox Code Playgroud)

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

select value from v$parameter where name='service_names';
Run Code Online (Sandbox Code Playgroud)

显示名称不完全匹配。使用 Oracle 的数据库配置助手创建的条目最初是:

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

查询中的服务名称只是mydatabase而不是mydatabase.mydomain.com. 我将 tnsnames.ora 文件编辑为没有域部分的基本名称,因此它们看起来像这样:

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

我重新启动TNS Listener服务(我经常使用lsnrctl stoplsnrctl start从管理员命令窗口[或Windows PowerShell]代替服务控制面板,但两者的工作。)在那之后,我能够连接。


Jan*_*rus 6

对于 Dbeaver 用户:尝试在连接设置中选择“SID”而不是“服务名称”。


Rik*_*ika 5

我有同样的问题。对我来说,只是写作

sqlplus myusername/mypassword@localhost
Run Code Online (Sandbox Code Playgroud)

做到了,我猜这样做会使其连接到默认服务名称。