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

问题描述 投票:187回答:19

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

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

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

sqlplus username/password@addressname[or host name]

我们已经证实:

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

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

oracle oracle11g sqlplus tnsping
19个回答
182
投票

我有这个问题,修复是为了确保在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到远程数据库并责怪DBA;)*)


2
投票

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

您可以使用以下命令验证您的网络IP(inet end。)

$ifconfig

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

$cat /etc/hosts

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

$sudo gedit /etc/hosts

再见。


2
投票

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

sqlplus myusername/mypassword@localhost

诀窍,这样做使我连接到默认服务名称我猜。


2
投票

对于那些可能在VM中运行Oracle的人(像我一样),我看到了这个问题,因为我的VM内存不足,这似乎阻止了OracleDB正常启动/运行。增加我的VM内存并重新启动修复了该问题。


2
投票

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


2
投票

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

对我来说,指定正确的SERVICE_NAME后错误12514已解决。您可以在tnsnames.ora文件中的服务器上找到3个预定义的服务名称(其中一个是“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,是一个纯粹的托管DLL,工作在32位和64位位进程也依赖于没有其他DLL,也不需要任何注册表项。
  8. 以下C#代码适用于我,无需在服务器端进行任何配置(只是默认安装):
using Oracle.DataAccess.Client;
or
using Oracle.ManagedDataAccess.Client;

....

string oradb = "Data Source=(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;";

using (OracleConnection conn = new OracleConnection(oradb)) 
{
    conn.Open();
    using (OracleCommand cmd = new OracleCommand())
    {
        cmd.Connection  = conn;
        cmd.CommandText = "select TABLESPACE_NAME from DBA_DATA_FILES";

        using (OracleDataReader dr = cmd.ExecuteReader())
        {
            while (dr.Read())
            {
                listBox.Items.Add(dr["TABLESPACE_NAME"]);
            }
        }
    }
}

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


1
投票

就我而言,数据库的磁盘空间已用完。这导致它没有回应。一旦我解决了这个问题,一切都恢复了。


1
投票

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

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

我查询了系统数据库:

select * from global_name;

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

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


0
投票

对我来说,这是由使用安装使用动态IP地址引起的。我使用静态IP地址安装了Oracle,然后一切都很好


0
投票

重新启动VM对我有用


-1
投票

我已经完成了以下工作来解决此问题。

  1. 我在cmd提示符下设置了oracle_home(右键单击cmd.exe以系统管理员身份运行)。用于以下命令 设置oracle_home =“oracle home的路径”

我在我的D:驱动器中安装了oracle。

  1. 并转到所有程序 - > Oracle -ora home1 - >配置迁移工具Net Manager - > Listener - >从下拉列表中选择数据库服务 - >全局数据库名称和SID都设置为相同,在我的情况下它是ORCL,设置oracle_home目录。单击“文件”并保存网络配置。

35
投票

我知道这是一个老问题,但仍然没有答案。我花了一天时间研究,但我发现了最简单的解决方案,至少在我的情况下(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))
    )
  )

12
投票

我在Windows Server 2008 R2和Oracle 11g上遇到过这个问题

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

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


8
投票

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

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

完成!


7
投票

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


4
投票

这真的应该是对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监听器服务(我经常使用管理员命令窗口[或Windows Powershell]中的lsnrctl stoplsnrctl start而不是服务控制面板,但两者都有效。)之后,我能够连接。


2
投票

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


2
投票

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

你可以从oracle网站Sql Developer下载该工具

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


2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.