【问题标题】:ORA-12514 TNS:listener does not currently know of service requested in connect descriptorORA-12514 TNS: 监听器当前不知道连接描述符中请求的服务
【发布时间】:2012-06-02 22:43:16
【问题描述】:

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

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

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

sqlplus username/password@addressname[or host name]

我们已经证实:

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

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

【问题讨论】:

  • 您使用的 TNSPing 命令(带参数)是什么?
  • 当您说“在本地运行”时,您的意思是应用程序正在连接到同一主机上的数据库?另外,你的 sqlnet.ora 文件的内容是什么? sqlplus 和 tnsping 报告了哪些版本,你确定它们在同一个 ORACLE_HOME 中吗?
  • 尝试重新启动数据库。由于他们应该在启动时通知侦听器他们的存在,这可能会解决您的问题。
  • ALTER SYSTEM REGISTER 没有重新启动数据库那么激烈。
  • 经过充分研究,在这里找到了正确的解决方案shekhargulati.com/2019/01/22/…

标签: oracle oracle11g sqlplus ora-12514 tnsping


【解决方案1】:

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

【讨论】:

  • 这正是我的问题。我们的数据库托管在一个 VM 上,当我尝试使用另一个使用 DP 的程序时,该 VM 已关闭。看到这个帖子后,我意识到它可能已经关闭了。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 在win7上,%ORACLE_HOME%\NETWORK\ADMIN\tnsnames.ora
    • 如果我什至无法连接到数据库,我应该如何查询它??
    • 你能直接ssh到数据库服务器并从那里运行sqlplus吗?
    • ORA-00942: 表或视图不存在
    • here 在查看每个答案后为我工作
    【解决方案4】:

    我在 Windows server 2008 R2Oracle 11g

    上遇到过这个问题

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

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

    【讨论】:

    • 这在我的系统上是错误的:“全局数据库名称”必须与“SID”相同 - 如果这些值必须相同,这根本不直观,为什么这两个单独的参数? -.-
    【解决方案5】:

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

    【讨论】:

    • 需要使用listener.ora 存储名称的语法来更新此答案。我什至没有listener.ora 文件。我也在运行 SQL Developer 的客户端工作站上,并在收到错误时尝试创建一个数据库链接。我没有要重新启动的 Oracle 侦听器服务。
    • vapcguy,您需要在数据库服务器上。听起来你在客户端
    • 按照 Sepideh 的有关网络管理器的说明后,我注意到我的 listeners.ora 文件已更新为包含一个新的 SID_LIST 条目。我已编辑此答案以包含语法的前后示例,以使无论出于何种原因都无法使用网络管理器的读者受益。
    【解决方案6】:

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

    【讨论】:

    • 我怎样才能找到这个?
    【解决方案7】:

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

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

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

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

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

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

    【讨论】:

      【解决方案8】:

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

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

      $ifconfig
      

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

      $cat /etc/hosts
      

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

      $sudo gedit /etc/hosts
      

      再见。

      【讨论】:

      • 这是旧的,但是将您的 IP 添加到 /etc/hosts 没有多大意义。 OP 缺少 SERVICE_NAME,其他内容完全不相关
      • 我没有将我的 IP 添加到 /etc/host.我刚刚纠正了它。正如您在本主题中所看到的,有许多有效的(带有赞成票的)答案和变体可以解决这个问题。如果该答案对您没有帮助,为什么要投反对票?这个答案可能仍然对某人有所帮助,因为它对我有所帮助。
      【解决方案9】:

      我遇到了同样的问题。对我来说,只是写

      sqlplus myusername/mypassword@localhost
      

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

      【讨论】:

      • 我们的连接字符串存在类似问题,导致此错误。我们使用 Oracle 的 JDBC 瘦驱动程序连接字符串:jdbc:oracle:thin:@//localhost:1521/orcl。用于消除此错误的更正连接字符串是:jdbc:oracle:thin:@localhost:1521
      • 这取决于这是否可行 - 我认为这种连接方式,根据其他人所说的判断,完全绕过侦听器,使用计算机主机名而不是 SID - 这种连接方式会导致问题第三方客户端,-我认为它也仅在 sqlnet.ora 中指定 EZCONNECT 时才有效:NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
      【解决方案10】:

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

      【讨论】:

      • 在 windows 中,如果您使用的是 Oracle Release 12.x,请确保服务 OracleServiceORCL 正在运行。如果此服务未启动,那么您也会收到相同的错误代码。
      【解决方案11】:

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

      【讨论】:

        【解决方案12】:

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

        【讨论】:

        • 在我的情况下,虽然启动类型设置为自动,但它不会在机器启动时启动。手动启动服务“OracleServiceXE”后,它适用于Oracle Database 11g Express连接到DB和APEX(Oracle Application Express)网页。
        【解决方案13】:

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

        【讨论】:

          【解决方案14】:

          这确实应该是对 [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

          【讨论】:

            【解决方案15】:

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

            对我来说,指定正确的 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 是可选的。你也可以把它放在一边。

            【讨论】:

            • 非常感谢,从您的解决方案中我找到了诀窍,在我的情况下,是防病毒软件阻止了程序,因此无法获得与 Oracle 数据库的连接。
            【解决方案16】:

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

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

            完成!

            【讨论】:

              【解决方案17】:

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

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

              我查询了系统数据库:

              从全局名称中选择 *;

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

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

              【讨论】:

                【解决方案18】:

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

                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 窗口示例:

                1. 点击文件并保存网络配置。

                【讨论】:

                  【解决方案19】:

                  重启虚拟机对我有用

                  【讨论】:

                    【解决方案20】:

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

                    【讨论】:

                      【解决方案21】:

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

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

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

                      su - oracle
                      export ORACLE_SID=XE
                      sqlplus sys as sysdba
                      

                      然后在 sql 控制台中

                      startup
                      

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

                      【讨论】:

                        【解决方案22】:

                        问题是我的连接字符串 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”,但解决方案也应该适用于其他版本。

                        【讨论】:

                          【解决方案23】:

                          就我而言,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))
                          

                          【讨论】:

                            【解决方案24】:

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

                            这对我有用:)

                            【讨论】:

                              【解决方案25】:

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

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

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

                              【讨论】:

                                【解决方案26】:

                                问题可能出在不正确的 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
                                

                                【讨论】:

                                  【解决方案27】:

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

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

                                  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 检查了监听器的状态。在这里,我可以看到成功加载的 db 实例。

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

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

                                  【讨论】:

                                    【解决方案28】:

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

                                    【讨论】:

                                      猜你喜欢
                                      • 1970-01-01
                                      • 2015-06-15
                                      • 2016-01-07
                                      • 2020-10-10
                                      • 2011-12-01
                                      • 1970-01-01
                                      相关资源
                                      最近更新 更多