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

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

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

我已经testing了使用正确parsing的TNSPing的连接,并且我尝试了SQLPlus来尝试连接,失败的错误与上面相同。 我使用SQLPlus这个语法:

 sqlplus username/password@addressname[or host name] 

我们已经证实:

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

我们不知道对这个环境做了什么改变。 还有什么我们可以testing的?

我有这个问题,修复是确保在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客户端工作站运行sqlplus到远程数据库,并指责数据库pipe理员;)*)

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

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

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

我添加了问题的服务名称,然后在Windows“服务”控制面板中,我做了一个“重新启动”Oracle监听器服务。 现在一切都很好。

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

进入Net Manager> Listener>从comboxselect数据库服务>“全局数据库名称”必须与“SID”和“Oracle主目录”必须相同。

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

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

检查数据库是否已经启动。 login到服务器,将ORACLE_SID环境variables设置为您的数据库SID,然后以本地连接的方式运行SQL * Plus。

我也面临同样的问题,花了3天时间挖出来。 这是因为你错误的TNS服务条目。 首先检查你是否能够使用sql> sqlplus sys @ orastand as sysdba(orastand是备用数据库)从主数据库连接到备用数据库,如果你无法连接,那么它是服务的问题。 更正主端的TNS文件中服务名称的input。 在备用数据库中查看同样的方式,如果需要在这里进行更改。 并确保log_archive_dest_2 parmater具有正确的服务名称。

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

 sqlplus myusername/mypassword@localhost 

做的伎俩,这样做,使其连接到我猜的默认服务名称。

这真的应该是对布拉德·瑞普的回答的一个评论,但唉,没有足够的代表。 这个答案让我有90%的方式。 在我的情况下,数据库的安装和configuration将条目放入我正在运行的数据库的tnsnames.ora文件中。 首先,我可以通过设置环境variables(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数据库configuration助手创build的条目原来是:

 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从pipe理员命令窗口[或Windows Powershell]启动,而不是从服务控制面板启动,但两者都能正常工作。)之后,我就可以连接了。

在我的情况下,错误是因为听众没有注册数据库的服务。 我通过注册服务解决了这个问题。 例:

我在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 

完成!

当应用程序为每个数据库交互build立新的连接或者连接没有正确closures时,可能会发生此错误。 其中一个免费的工具来监视和确认这是Oracle Sql开发人员(尽pipe这不是您可以用来监视DB会话的唯一工具)。

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

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

在这里输入图像描述

在我的情况下,数据库已经用完了磁盘空间。 这导致它没有回应。 一旦我清理了这个问题,一切工作再次。

我在我的linux环境下解决了这个问题,在/ etc / hosts文件中更新了我的机器的IP。

您可以validation您的networkingIP(inet结束):

 $ifconfig 

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

 $cat /etc/hosts 

编辑你的/ etc / hosts文件,如果需要的话:

 $sudo gedit /etc/hosts 

再见。

对于那些可能在虚拟机上运行Oracle的人(像我),我看到这个问题,因为我的虚拟机内存不足,这似乎阻止了OracleDB正确启动/运行。 增加我的虚拟机内存并重新启动解决了这个问题。

对我来说真的很简单,我只需要在“Windows服务”(cmd trompt中的services.msc)中手动启动服务。 我的服务名称是:OracleServiceXXXXX。

这里有很多答案,但是这里有一个可以复制,粘贴和testing的代码示例:

对于我来说,错误12514在指定了正确的SERVICE_NAME后解决了。 你会发现在tnsnames.ora文件的服务器上有3个预定义的服务名称(其中之一是“XE”)。

  1. 我安装了Oracle Express数据库OracleXE112,它已经附带了一些预安装的演示表。
  2. 当您启动安装程序时,系统会要求您input密码。 我input“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位于同一目录中,或者必须在以下位置指定DLLpath: 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。 registrypath是HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
  7. 选项C:如果你不想要超过100MB的巨大的DLL,你应该下载ODP.NET_Managed12.xxxxxxxx.zip,其中你会发现只有4MB的Oracle.ManagedDataAccess.dll ,是一个纯粹的托pipeDLL,工作在32位和64位进程以及取决于没有其他的DLL,并不需要任何registry项。
  8. 下面的C#代码适用于我,没有在服务器端进行任何configuration(只是默认的安装):
使用Oracle.DataAccess.Client;
要么
使用Oracle.ManagedDataAccess.Client;

 ....

stringoradb =“数据源=(DESCRIPTION =”
     +“(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = 192.168.1.158)(PORT = 1521)))
     +“(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = XE)));”
     +“User Id = SYSTEM; Password = xxx;”;

使用(OracleConnection conn = new OracleConnection(oradb)) 
 {
     conn.Open();
    使用(OracleCommand cmd = new OracleCommand())
     {
         cmd.Connection = conn;
         cmd.CommandText =“从DBA_DATA_FILESselectTABLESPACE_NAME”;

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

如果SERVICE_NAME=XE错误,则会收到错误12514. SERVICE_NAME是可选的。 你也可以离开它。

如果你得到了这个错误信息,但没有像OP那样成功地尝试过TNSPing,那么试试这些指令来启动Oracle和监听器 。

对我来说,这是由使用安装dynamicipadress引起的。 我使用静态ipadress重新安装Oracle,然后一切都很好

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

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

我查询了系统数据库:

select * from global_name;

并find我的远程SID(“XE”)。

然后我可以连接没有任何问题。