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


226

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

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

我已经测试了使用TNSPing该连接可以正确解决的连接,并尝试SQLPlus尝试连接,但连接失败,并出现与上述相同的错误。我将此语法用于SQLPlus

sqlplus username/password@addressname[or host name]

我们已验证:

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

我们不知道对此环境所做的任何更改。我们还能测试什么?


2
您使用的TNSPing命令(带有参数)是什么?
Grzegorz W

当您说“在本地运行”时,是指该应用程序正在连接到同一主机上的数据库?另外,您的sqlnet.ora文件的内容是什么?报告了sqlplus和tnsping的哪些版本,并且您确定它们在同一ORACLE_HOME中吗?
大卫·奥尔德里奇

1
尝试重新启动数据库。由于他们应该在启动时通知侦听器有关其存在的信息,因此可能会解决您的问题。
延斯·肖德

1
ALTER SYSTEM REGISTER比重新启动数据库没有那么激烈。
DCookie

Answers:


209

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

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

一旦我更新tnsnames.ora为:

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

然后我跑了:

sqlplus user@TEST

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

(*我正在从Win7客户端工作站到远程DB运行sqlplus并责怪DBA;)*)


2
在win7上,%ORACLE_HOME%\ NETWORK \ ADMIN \ tnsnames.ora
Brad Rippe

198
如果我什至无法连接到数据库,我应该如何查询它?
伊莎贝尔·马兹(Isabelle Martz)'16

2
您可以直接SSH到数据库服务器并从那里运行sqlplus吗?
布拉德·里普

1
当或曾经在同一台计算机上安装多个客户端/服务器时,情况可能并非如此。(tnsping输出它使用的目录的位置)-在我的情况下,该目录中的listener.ora包含与我已卸载的旧数据库实例有关的信息-快速而肮脏的方法是从以下位置复制listener.ora的全部内容我当前安装的Oracle Express,到侦听器似乎正在检查的其他目录(我认为我通过注册表或其他方法更改了它,并且它的优先级高于ORACLE_HOME(?))
hello_earth

8
ORA-00942:表或视图不存在
Tommy Holman '18

44

我知道这是一个老问题,但仍然没有答案。我花了一天的时间进行研究,但我找到了最简单的解决方案,至少就我而言(在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))
    )
  )

...并使其能够识别服务名称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))
    )
  )

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

vapcguy,您需要位于数据库服务器上。听起来像是您在客户端上
Joseph Argenio

在遵循Sepideh的有关Net Manager的说明之后,我注意到我的listeners.ora文件已更新为包含一个新的SID_LIST条目。我已经编辑了此答案,以包含语法的前后示例,以使出于某些原因而无法使用Net Manager的读者受益。
凯文

12

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

转到Net Manager>侦听器>从combox中选择数据库服务>“全局数据库名称”必须与“ SID”相同,“ Oracle主目录”必须正确。

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


12

在我的情况下,错误是由于侦听器未注册数据库服务而造成的。我通过注册服务解决了这个问题。例:

我的描述符在tnsnames.ora

LOCALDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = LOCALDB)
    )
  )

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

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

做完了!


8

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


在Windows中,如果使用的是Oracle Release 12.x,请确保服务OracleServiceORCL正在运行。如果此服务未启动,那么您还将收到相同的错误代码。
街头鹰

5

这确实应该是对Brad Rippe的回答的评论,但是可惜,代表还不够。这个答案让我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 Listener服务(我经常使用lsnrctl stoplsnrctl start从管理员命令窗口[或Windows PowerShell]代替服务控制面板,但两者的工作。)在那之后,我能够连接。


4

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

sqlplus myusername/mypassword@localhost

我猜到了,这样做就可以了,它使它连接到默认服务名称。


1
我们的连接字符串存在类似的问题,导致此错误。我们正在使用带有连接字符串的Oracle JDBC瘦驱动程序进行连接jdbc:oracle:thin:@//localhost:1521/orcl。消除此错误的更正的连接字符串为:jdbc:oracle:thin:@localhost:1521
2013年

这取决于是否可行-我认为这种连接方式(根据其他人的判断)正在使用计算机主机名而不是SID完全绕过侦听器-这种连接方式会导致第三方客户端出现问题,-我认为它仅在sqlnet.ora中指定EZCONNECT时也有效:NAMES.DIRECTORY_PATH =(TNSNAMES,EZCONNECT)
hello_earth

3

对我有用的方法非常简单,我只需要在“ Windows服务”(cmd trompt中的services.msc)中手动启动该服务。我的服务名称是:OracleServiceXXXXX。


就我而言,尽管“启动类型”设置为“自动”,但是在计算机启动时它不会启动。手动启动服务“ OracleServiceXE”后,它可用于Oracle Database 11g Express连接到DB和APEX(Oracle Application Express)网页。
伊万·

2

检查数据库是否启动。登录到服务器,将ORACLE_SID环境变量设置为数据库SID,然后将SQL * Plus作为本地连接运行。


这正是我的问题。我们的数据库托管在一个VM上,该VM在我尝试使用另一个使用DP的程序时已关闭。看到此线程后,我意识到它可能已关闭。
Sh4d0wsPlyr '16

2

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

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

这是如何监控会话的屏幕截图。(如果在看到ORA-12514错误的过程中看到许多会话在为您的应用程序用户堆积,则表明您可能有连接池问题)。

在此处输入图片说明


2

我在Linux环境中解决了此问题,并更新了/ etc / hosts文件中计算机的IP。

您可以使用以下方法验证您的网络IP(结束)。

$ifconfig

查看您的IP是否与/ etc / hosts文件匹配:

$cat /etc/hosts

编辑/ etc / hosts文件(如果需要):

$sudo gedit /etc/hosts

再见


2
这很旧,但是将IP添加到/ etc / hosts并没有多大意义。OP缺少SERVICE_NAME,其他的东西是相当无关
Ostap

我尚未将IP添加到/ etc / host。我只是更正了。正如您在本主题中所看到的,有许多有效的(带有批注的)答案和变体可以解决这个问题。如果该答案没有帮助您,为什么要投票?这个答案可能仍然对我有所帮助。
塞尔吉奥·MC·菲盖雷多

2

对于那些可能在VM中运行Oracle的用户(如我),我看到了此问题,因为我的VM内存不足,这似乎阻止了OracleDB正确启动/运行。增加我的VM内存并重新启动可解决此问题。


2

这里有很多答案,但是这里有一个工作示例,其中包含代码,您可以立即复制,粘贴和测试:

对我来说,错误12514在指定正确的SERVICE_NAME后得以解决。您在服务器上的tnsnames.ora3个预定义服务名称(其中一个是“ XE”)中找到该文件。

  1. 我安装了Oracle Express数据库OracleXE112,该数据库已经预装了一些演示表。
  2. 启动安装程序时,系统会要求您输入密码。我输入“ xxx”作为密码。(未用于生产中)
  3. 我的服务器在机器192.168.1.158上运行
  4. 在服务器上,您必须明确允许Windows防火墙中的进程TNSLSNR.exe的访问。此过程在端口1521上侦听。
  5. 选项A:对于C#(。NET2或.NET4),您可以下载ODAC11,从中必须将Oracle.DataAccess.dll添加到您的项目中。此外,此DLL取决于:OraOps11w.dll,oci.dll,oraociei11.dll(130MB!),msvcr80.dll。这些DLL必须与EXE位于同一目录中,或者您必须在以下位置指定DLL路径:HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath。在64位计算机上,另外写入HKLM\SOFTWARE\Wow6432Node\Oracle\...
  6. 选项B:如果已下载ODAC12,则需要Oracle.DataAccess.dll,OraOps12w.dll,oci.dll,oraociei12.dll(160MB!),oraons.dll,msvcr100.dll。注册表路径是HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
  7. 选项C:如果您不希望超过100 MB的巨大DLL,则应下载ODP.NET_Managed12.xxxxxxxx.zip,在其中找到Oracle.ManagedDataAccess.dll只有4 MB,并且是可在32位和64位进程中运行的纯托管DLL。同样,它不依赖其他DLL,并且不需要任何注册表项。
  8. 以下C#代码对我有用,无需在服务器端进行任何配置(仅是默认安装):
使用Oracle.DataAccess.Client;
要么
使用Oracle.ManagedDataAccess.Client;

....

字符串oradb =“数据源=(DESCRIPTION =”
    +“(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = 192.168.1.158)(PORT = 1521)))”
    +“(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = XE)));”“
    +“用户ID = SYSTEM;密码= xxx;”;

使用(OracleConnection conn =新的OracleConnection(oradb)) 
{
    conn.Open();
    使用(OracleCommand cmd = new OracleCommand())
    {
        cmd.Connection = conn;
        cmd.CommandText =“从DBA_DATA_FILES中选择TABLESPACE_NAME”;

        使用(OracleDataReader dr = cmd.ExecuteReader())
        {
            而(dr.Read())
            {
                listBox.Items.Add(dr [“ TABLESPACE_NAME”]);
            }
        }
    }
}

如果SERVICE_NAME=XE错误,则会出现错误12514。SERVICE_NAME是可选的。您也可以将其丢弃。


非常感谢,从您的解决方案中,我发现了窍门,就我而言,是防病毒阻止了该程序,因此无法获得与Oracle数据库的连接。
robot_alien

2

我也遇到过同样的问题,花了3天时间将其挖掘出来。

发生这种情况是由于您输入了错误的TNS服务。

首先检查您是否能够使用sql> sqlplus sys@orastand as sysdbaorastand是备用数据库)从主数据库连接到备用数据库。

如果您无法连接,则说明该服务存在问题。在主端更正TNS文件中的服务名称条目。

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

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


1

由于指定的远程SID错误,因此出现了相同的错误:

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

我查询了系统数据库:

选择* from global_name;

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

然后,我可以毫无问题地进行连接。


0

在我的情况下,数据库用完了磁盘空间。这导致它没有响应。一旦我解决了这个问题,一切都会恢复。


我如何找到这个?
CodeSlave

0

对我来说,这是由使用安装时使用的动态ipadress引起的。我使用静态ipadress重新安装了Oracle,然后一切正常



0

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


0

tnslsnr 已启动,但数据库已关闭。

对于oracle新手来说,接受连接时数据库可能已关闭并不明显。

我不得不像这样手动启动数据库

su - oracle
export ORACLE_SID=XE
sqlplus sys as sysdba

然后在SQL控制台

startup

在我的情况下,我无法启动,但是又收到另一条错误消息,并发现了问题的根源-我不得不更改主机名,然后数据库自动启动再次起作用。


0

我已实施以下解决方法来解决此问题。

  1. 我已经使用命令提示符设置了ORACLE_HOME(右键单击cmd.exe并以系统管理员身份运行)。

  2. 在下面的命令中使用

    set oracle_home="path to the oracle home"

  3. 转到所有程序 -> Oracle -ora home1- > 配置迁移工具 -> Net Manager- > 侦听器

  4. 从下拉列表中选择数据库服务。全局数据库名称和SID都设置为相同(在我的情况下为ORCL)。设置Oracle主目录。

oracle文档中的Oracle Net Manager窗口示例: Oracle Net Manager示例

  1. 单击文件并保存网络配置。

0

问题是我的连接字符串URL包含数据库名称而不是SID。用oracle数据库连接SID替换数据库名称可解决此问题。

要了解您的oracle SID,可以浏览tnsnames.ora文件。

XE 是实际的SID,所以这是我的tomcat连接字符串现在的样子:

    <Resource
       name="jdbc/my_db_conn"
       auth="Container"
       type="javax.sql.DataSource"
       driverClassName="oracle.jdbc.driver.OracleDriver"
       url="jdbc:oracle:thin:@//127.0.0.1:1521/XE"
       username="test_user"
       password="test" />

我的服务器版本为“ Oracle 11.2 Express”,但解决方案也应适用于其他版本。


0

就我而言,tnsnames.ora文件中缺少SERVICE_NAME周围的圆括号。

<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))

0

对于那些使用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

这对我有用:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.