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”)。
然后我可以连接没有任何问题。