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

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

我已经使用正确解决的tnspring测试了连接 我尝试使用SQLPlus进行连接,但失败了,出现了与上面相同的错误。我在SQLPlus中使用了以下语法:

sqlplus username/password@addressname[or host name]

我们已核实:

服务器上的TNS Listener正在运行。 服务器上的Oracle本身正在运行。

我们不知道这个环境发生了什么变化。 还有什么可以测试的吗?


当前回答

问题可能在于不正确的URL。

例如,我正在使用Oracle数据库(在VM内部)与Spring框架,并有这个问题。

在我的申请中。属性文件:

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

其他回答

这真的应该是对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监听器服务(我经常使用lsnrctl stop和lsnrctl start从管理员命令窗口[或Windows Powershell],而不是服务控制面板,但两者都工作。)在那之后,我能够与人沟通。 [1]: https://stackoverflow.com/users/979521/brad-rippe

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

我只需要替换我的连接字符串

来自:

jdbc:oracle:thin:@localhost:1521:xe

To:

jdbc:oracle:thin:@localhost:1521:orcl

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

我已经实现了下面的解决方法来解决这个问题。

我已经使用命令提示符设置了ORACLE_HOME (右键单击cmd.exe并以系统管理员身份运行)。 使用以下命令 设置oracle_home="到oracle home的路径" 进入“所有程序——> Oracle -ora home1——>配置迁移工具——> Net Manager——> Listener” 从下拉菜单中选择数据库服务。 全局数据库名和SID都设置为相同(在我的例子中是ORCL)。 设置“Oracle Home Directory”。

Oracle Net Manager窗口示例:

单击File并保存网络配置。