284

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

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

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

sqlplus username/password@addressname[or host name]

我们已经验证:

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

我们不知道对此环境进行了任何更改。还有什么我们可以测试的吗?

4

28 回答 28

258

我遇到了这个问题,解决方法是确保在您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 到远程 DB 并责怪 DBA ;) *)

于 2013-04-16T23:36:56.267 回答
63

我知道这是一个老问题,但仍然没有答案。我花了一天的时间研究,但我找到了最简单的解决方案,至少在我的情况下(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))
    )
  )
于 2014-03-25T12:13:31.183 回答
22

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

我的描述符在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

完毕!

于 2017-05-31T23:39:01.720 回答
13

我在Windows server 2008 R2Oracle 11g上遇到过这个问题

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

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

于 2013-12-21T14:27:27.900 回答
9

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

于 2015-06-16T07:48:19.700 回答
7

这确实应该是对 [Brad Rippe][1] 的回答的评论,但可惜,没有足够的代表。这个答案让我成功了 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不是服务控制面板,但两者都可以工作。)之后,我能够连接。[1]:https ://stackoverflow.com/users/979521/brad-rippe

于 2016-12-19T14:38:55.100 回答
6

对于那些使用 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

这对我有用:)

于 2020-06-16T08:18:34.687 回答
5

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

sqlplus myusername/mypassword@localhost

成功了,我猜这样做会使其连接到默认服务名称。

于 2014-09-09T04:01:30.160 回答
3

我也遇到了同样的问题,花了 3 天时间才把它挖出来。

这是因为您输入了错误的 TNS 服务条目。

首先检查您是否能够使用 sql > sqlplus sys@orastand as sysdbaorastand是备用数据库)从主数据库连接到备用数据库。

如果您无法连接,则说明服务有问题。更正主端TNS文件中服务名称的输入。

以同样的方式检查备用数据库。如果需要,也可以在此处进行更改。

确保log_archive_dest_2参数具有正确的服务名称。

于 2014-06-26T06:41:06.863 回答
3

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

于 2016-05-12T13:57:24.667 回答
2

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

于 2012-05-29T00:50:27.980 回答
2

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

您可以从 oracle 站点Sql Developer下载该工具

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

在此处输入图像描述

于 2013-04-01T00:21:58.280 回答
2

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

您可以通过以下方式验证您的网络 IP(inet 端):

$ifconfig

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

$cat /etc/hosts

编辑您的 /etc/hosts 文件(如果需要):

$sudo gedit /etc/hosts

再见。

于 2014-09-03T15:27:19.117 回答
2

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

于 2016-04-14T18:14:23.417 回答
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# 代码适用于我,无需在服务器端进行任何配置(只是默认安装):
使用 Oracle.DataAccess.Client;
或者
使用 Oracle.ManagedDataAccess.Client;

……

字符串 oradb = "数据源 =(DESCRIPTION="
    +“(地址列表=(地址=(协议=TCP)(主机=192.168.1.158)(端口=1521)))”
    + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=XE)));"
    + "用户ID=SYSTEM;密码=xxx;";

使用 (OracleConnection conn = new OracleConnection(oradb))
{
    conn.Open();
    使用 (OracleCommand cmd = new OracleCommand())
    {
        cmd.Connection = 连接;
        cmd.CommandText = "从 DBA_DATA_FILES 中选择 TABLESPACE_NAME";

        使用 (OracleDataReader dr = cmd.ExecuteReader())
        {
            而 (dr.Read())
            {
                listBox.Items.Add(dr["TABLESPACE_NAME"]);
            }
        }
    }
}

如果SERVICE_NAME=XE错误,您将收到错误 12514。这SERVICE_NAME是可选的。你也可以离开它。

于 2017-04-20T21:19:22.060 回答
1

在我的情况下,数据库已经用完了磁盘空间。导致它没有反应。一旦我解决了这个问题,一切都会再次起作用。

于 2014-04-20T02:12:11.110 回答
1

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

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

我查询了系统数据库:

从全局名称中选择 *;

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

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

于 2017-10-13T10:55:08.497 回答
1

对于 Dbeaver 用户:尝试在连接设置中选择“SID”而不是“服务名称”。

于 2021-08-30T06:49:16.863 回答
0

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

于 2016-12-03T07:45:39.290 回答
0

我已实施以下解决方法来解决此问题。

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

  2. 使用下面的命令

    set oracle_home="path to the oracle home"

  3. 转到所有程序--> Oracle -ora home1 -->配置迁移工具-->网络管理器-->监听器

  4. 从下拉列表中选择数据库服务。全局数据库名称和 SID 都设置为相同(在我的情况下为 ORCL)。设置 Oracle 主目录。

oracle 文档中的 Oracle Net Manager 窗口示例: Oracle 网络管理器示例

  1. 单击文件并保存网络配置。
于 2017-11-29T12:34:31.157 回答
0

重新启动虚拟机对我有用

于 2019-03-20T03:35:52.673 回答
0

通过将 URL 中的“SID”替换为“服务名称”和正确的主机,我的问题得到了解决。

于 2019-08-23T13:47:35.307 回答
0

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

对于 oracle 新手来说,在接受连接时数据库可能已关闭并不明显。

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

su - oracle
export ORACLE_SID=XE
sqlplus sys as sysdba

然后在 sql 控制台

startup

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

于 2019-11-11T09:38:09.603 回答
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”,但解决方案也应该适用于其他版本。

于 2019-12-05T12:07:44.347 回答
0

就我而言, SERVICE_NAME 周围的圆括号在tnsnames.ora文件中丢失。

<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))
于 2020-03-10T17:59:47.303 回答
0

我有一个案例,我使用了 DBMS,我必须填写一个数据库连接表单。

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

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

于 2020-07-28T16:02:00.347 回答
0

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

例如,我正在使用带有 Spring 框架的 Oracle 数据库(在 VM 内)并遇到此问题。

我的 application.properties 文件中有:

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

但 db 版本不同:

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

正确的 URL 可以在tnsnames.ora文件中找到(该文件在 Oracle 服务器中可用,因此如果您使用 VM,则应在主机 VM 中查找该文件)。例如,对于 VirtualBox 中的 Oracle,查看此文件的命令是:

nano /u01/app/oracle/product/version/db_1/network/admin/tnsnames.ora
于 2021-04-17T21:59:31.070 回答
0

在我的Linux环境中,oracle 文件以“红色ORACLE_HOME/bin”颜色突出显示,具有不同的权限,如下所示:
在此处输入图像描述

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

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

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

但是,我只能使用sqldeveloper进行连接,使用 sqlplus 命令行时ORA-12547: TNS Lost Contact出现错误。因此,这是使用 sqldeveloper的快速解决方法。

注意:在更改权限之前备份 oracle 文件。

于 2021-08-11T13:49:34.260 回答