ORA-12514 TNS:侦听器当前不知道在连接描述符中请求的服务
我们有一个应用程序在本地运行,我们遇到以下错误:
ORA-12514:TNS:侦听器当前不知道在连接描述符中请求的服务
我已经testing了使用正确parsing的TNSPing的连接,并且我尝试了SQLPlus来尝试连接,失败的错误与上面相同。 我使用SQLPlus这个语法: 
 sqlplus username/password@addressname[or host name] 
我们已经证实:
- 服务器上的TNS侦听器正在运行。
- Oracle本身在服务器上运行。
我们不知道对这个环境做了什么改变。 还有什么我们可以testing的?
 我有这个问题,修复是确保在tnsnames.ora , SERVICE_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 R2和Oracle 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 stop和lsnrctl 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”)。 
- 我安装了Oracle Express数据库OracleXE112,它已经附带了一些预安装的演示表。
- 当您启动安装程序时,系统会要求您input密码。 我input“xxx”作为密码。 (不用于生产)
- 我的服务器在机器192.168.1.158上运行
- 在服务器上,您必须明确允许访问Windows防火墙中的进程TNSLSNR.exe。 该进程在端口1521上侦听。
-   选项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\...
-   选项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
-   选项C:如果你不想要超过100MB的巨大的DLL,你应该下载ODP.NET_Managed12.xxxxxxxx.zip,其中你会发现只有4MB的Oracle.ManagedDataAccess.dll,是一个纯粹的托pipeDLL,工作在32位和64位进程以及取决于没有其他的DLL,并不需要任何registry项。
- 下面的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”)。
然后我可以连接没有任何问题。