【问题标题】:SQLPLUS / OCI8 => ORA-12154: TNS:could not resolve the connect identifier specified (OCIError)SQLPLUS / OCI8 => ORA-12154: TNS: 无法解析指定的连接标识符 (OCIError)
【发布时间】:2021-10-08 02:22:38
【问题描述】:

我在 WINDOWS 10Pro x64 中。我为我的 RUBY 环境安装了 gem:ruby_oci8

我安装了 ORACLE C:\instantclient_12_2 并添加到 PATH,我还安装了 SQLPLUS utils 并添加到 PATH

我需要连接到 REMOTE ORACLE DB

我的 tnsnames.ora,由 TNS_ADMIN 指向 -> 系统变量中的 C:\ORACLE\network\admin:

ORCL =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = <host>)(PORT = <port>))
    )
    (CONNECT_DATA =
      (SID = <sid>)
    )
  )

我是新手。请帮我做一些其他检查。

非常感谢!

【问题讨论】:

  • 警告:未设置 NLS_LANG。回退到 US7ASCII。
  • ORA-12154: TNS: 无法解析指定的连接标识符 (OCIError)
  • 您是否将数据库的别名放入 TNSNAMES.ORA 中?您究竟是如何尝试连接到那个远程数据库的?
  • @Littlefoot,我的连接方式如下:OCI8.new(@user, @password,"#{@host}:#{@port}/#{@sid}")
  • 我在本地机器上工作,本地机器上没有 TNSNAMES.ORA 文件

标签: ruby oracle sqlplus oci8


【解决方案1】:

调试你看不到的东西几乎是不可能的,而且你提供的东西很少。为什么不使用复制和粘贴来准确显示您所做的以及确切的结果 - 完整的命令行和完整的响应?在您的后续 cmets 中,您提到了一些其他错误消息,但同样没有上下文。

既然你提到了 sqlplus 和“run connect @”,我会假设你的命令看起来像这样:

C:> sqlplus scott/tiger@orcl

在这种用法中,'@' 是一个分隔符,指示后面的内容(本例中的'orcl')是网络服务名称。当 sqlplus 解析出命令行时,它会采用这个值('orcl')并在本地文件 'tnsnames.ora' 中查找匹配项。默认情况下,它将位于 %ORACLE_HOME/network/admin。典型的条目可能如下所示:

ORCL =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = somehostname)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )

第一行是 sqlplus 正在寻找的网络服务名称。如果未找到请求的网络服务名称,则会得到“ORA-12154: TNS:could not resolve the connect identifier specified”。这是一个非常明确的错误,恰好意味着以下两种情况之一:1) 无法找到文件“tnsnames.ora”,或 2) 已找到文件但没有请求的网络服务名称的条目。

因此,您需要证明在预期的位置有一个 tnsnames.ora 文件,并且它具有请求的网络服务名称的条目。

【讨论】:

  • 就我的本地计算机而言:1) 文件 'tnsnames.ora' 根本不存在,我没有 %ORACLE_HOME/network/admin
  • 我在安装过程中遗漏了什么吗?
  • tnsnames.ora 默认情况下不会创建,因为每个潜在条目的每个值都取决于本地配置。我没有使用即时客户端,但您可以将系统环境变量 TNS_ADMIN 设置为指向您选择的某个目录,并将 tnsnames.ora 放在该目录中。我会强烈在您的 C:\instantclient_12_2 下建议一个适当的目录。您可以使用我展示的示例条目,并对其进行修改以满足您的要求。
  • 请检查我的编辑
  • 好的,你已经创建了一个 tnsnames.ora,并用 TNS_ADMIN 指向它。那么,现在你尝试与 sqlplus 连接的结果是什么?另请注意,在我的示例中,我指定了 SERVICE_NAME=,但您已将其更改为 SID=。 SERVICE_NAME 是首选语法。此外,当您在此处发布时,没有理由屏蔽 PORT 或 SERVICE_NAME/SID。 HOST= 是唯一可以被认为是“敏感”的东西。服务名称在您的组织之外没有任何意义,并且端口应该是默认的 1521,世界上每个人都知道。
猜你喜欢
  • 2014-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-06
  • 2016-11-25
相关资源
最近更新 更多