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

时间:2012-05-28 15:07:05

标签: oracle oracle11g sqlplus ora-12514 tnsping

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

  

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

我使用正确解析的TNSPing测试了连接 我尝试SQLPlus尝试连接,但失败的错误与上面相同。我将此语法用于SQLPlus

sqlplus username/password@addressname[or host name]

我们已经确认:

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

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

26 个答案:

答案 0 :(得分:175)

我遇到了这个问题,修复方法是确保在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;)*)

答案 1 :(得分: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))
    )
  )

答案 2 :(得分:12)

我在 Windows server 2008 R2 Oracle 11g

中遇到此问题
  

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

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

答案 3 :(得分: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

完成!

答案 4 :(得分:7)

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

答案 5 :(得分: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,但两者都有效。)之后,我能够连接。

答案 6 :(得分:2)

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

您可以从oracle网站Sql Developer

下载该工具

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

enter image description here

答案 7 :(得分:2)

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

对我来说,指定正确的SERVICE_NAME后错误12514已解决。 您可以在文件tnsnames.ora中的服务器上找到3个预定义的服务名称(其中一个是&#34; XE&#34;)。

  1. 我安装了Oracle Express数据库OracleXE112,它已经预装了一些演示表。
  2. 启动安装程序时,系统会要求您输入密码。我输入了&#34; xxx&#34;作为密码。 (未用于生产)
  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位于同一目录中,或者必须在HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath中指定DLL路径。在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,其中找到{{1它只有4 MB,是一个纯托管DLL,也可以在32位和64位进程中工作,并且不依赖于其他DLL,也不需要任何注册表项。
  8. 以下C#代码对我没有任何配置在服务器端(只是默认安装):
  9. 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"]);
                }
            }
        }
    }

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

答案 8 :(得分:2)

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

答案 9 :(得分:2)

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

答案 10 :(得分:2)

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

sqlplus myusername/mypassword@localhost

做了这个伎俩,这样做会让它连接到我猜的默认服务名称。

答案 11 :(得分:2)

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

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

$ifconfig

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

$cat /etc/hosts

编辑你的/ etc / hosts文件,如果是nedded:

$sudo gedit /etc/hosts

再见。

答案 12 :(得分:2)

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

答案 13 :(得分:2)

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

答案 14 :(得分:1)

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

答案 15 :(得分:1)

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

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

我查询了系统数据库:

从global_name;

中选择*

找到我的远程SID(&#34; XE&#34;)。

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

答案 16 :(得分:0)

重启虚拟机对我有用

答案 17 :(得分:0)

我的问题已解决,方法是将URL中的“ SID”替换为“服务名称”并输入正确的主机。

答案 18 :(得分:0)

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

对于oracle新手来说,当连接被接受时,数据库可能不会关闭。

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

tnslsnr

然后在sql控制台中

su - oracle
export ORACLE_SID=XE
sqlplus sys as sysdba

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

答案 19 :(得分: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”,但解决方案也应适用于其他版本。

答案 20 :(得分: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))

答案 21 :(得分: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

这对我有用:)

答案 22 :(得分:0)

在我使用DBMS的情况下,我必须填写数据库连接表格。

我将SID放在“数据库”字段中,并且在该字段旁边的下拉列表中,我使用的是“服务名称”值而不是“ SID”值。
(通常我不使用Oracle数据库,所以我不知道有什么区别)

那是我收到错误消息的原因。

答案 23 :(得分:0)

问题可能出在不正确的 URL 中。

例如,我将 Oracle 数据库(在 VM 内部)与 Spring 框架一起使用,但遇到了这个问题。

我的 application.properties 文件中有:

spring.datasource.url=jdbc:oracle:thin:@//localhost:1521/orcl12c

但是数据库版本不同:

spring.datasource.url=jdbc:oracle:thin:@//localhost:1521/orclcdb

正确的 URL 可以在 tnsnames.ora 文件中找到(这个文件可以在 Oracle 服务器的地方找到,所以如果你使用 VM,你应该在你的主机 VM 中查找这个文件) . 比如Oracle在VirtualBox中查看这个文件的命令是:

nano /u01/app/oracle/product/version/db_1/network/admin/tnsnames.ora

答案 24 :(得分:0)

在我的 Linux 环境中,ORACLE_HOME/bin 处的 oracle 文件以“红色”颜色突出显示,具有不同的权限,如下所示:
enter image description here

我更改了这个文件的权限如下:

1) 停止 Oracle -> sudo systemctl stop oracle.service
2)修改ORACLE_HOME/bin目录下oracle文件的权限为“sudo chmod 777 oracle
3) 启动 Oracle -> sudo systemctl start oracle.service

然后在此更改后,我使用lsnrctl status检查了侦听器的状态。在这里,我可以看到成功加载了数据库实例。

注意:修改权限前备份oracle文件。

答案 25 :(得分:-1)

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

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

    设置oracle_home =&#34; oracle home&#34;

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

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