【问题标题】:SQLPLUS error:ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATASQLPLUS 错误:ORA-12504:TNS:listener 未在 CONNECT_DATA 中提供 SERVICE_NAME
【发布时间】:2015-06-21 22:44:14
【问题描述】:

我从 Oracle 下载了 SQLPLUS:

http://www.oracle.com/technetwork/topics/winx64soft-089540.html

基本 Lite 和 SQL*Plus

然后我启动了 SQL*Plus:

c:\Program Files\Oracle\instantclient_12_1>sqlplus /nolog

SQL*Plus: Release 12.1.0.2.0 Production on Wed Apr 15 15:25:36 2015

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

并尝试连接到数据库:

connect user\password@hostname

并收到错误消息:

ERROR:
ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATA

我错过了什么?

我运行了 Jakub 建议的查询,我得到了

SQL> select sys_context('USERENV','SERVICE_NAME') from dual;

SYS_CONTEXT('USERENV','SERVICE_NAME')
--------------------------------------------------------------------------------

SYS$USERS

SQL> select sys_context('USERENV','SID') from dual;

SYS_CONTEXT('USERENV','SID')
--------------------------------------------------------------------------------

877

SQL>

【问题讨论】:

  • 您在 tnsnames.Ora 文件中输入了 tns 条目吗?
  • 我没有 tsnames.ora 文件。我正在尝试使用 IP 地址进行连接(应该已经提到过,抱歉!)
  • 数据库是驻留在您的机器(Windows)还是服务器上? (可能是 linux , aix ....)?
  • 不在我的机器上。不确定服务器正在运行什么。

标签: oracle connect sqlplus


【解决方案1】:

我只在一台服务器上遇到过这种奇怪的行为,而且只来自脚本 当我输入环境变量 TNS_ADMIN 时它起作用了 尽管它是默认位置网络/管理员

【讨论】:

    【解决方案2】:

    我在相同的情况下遇到了完全相同的问题。我没有 tnsnames.ora 文件,我想在命令行中使用带有 Easy Connection Identifier 格式的 SQL*Plus。我解决了这个问题如下。

    SQL*Plus® User's Guide and Reference 举个例子:

    sqlplus hr@\"sales-server:1521/sales.us.acme.com\"

    注意两个重点:

    1. 引用了连接标识符。你有两个选择:
      1. 您可以使用 SQL*Plus CONNECT 命令并简单地传递带引号的字符串。
      2. 如果要在命令行上指定连接参数,则必须在引号前添加反斜杠作为屏蔽。它指示 bash 将引号传递到 SQL*Plus。
    2. 必须按照您的 DBA 配置的 FQDN 形式指定服务名称。

    我发现了这些通过现有连接检测服务名称的好问题:12。例如,试试这个查询:

    SELECT value FROM V$SYSTEM_PARAMETER WHERE UPPER(name) = 'SERVICE_NAMES'
    

    【讨论】:

    • 在运行 sqlplus --help 时没有显示连接标识符的引号...非常感谢!
    • 这也对我有用!谢谢!我在 bash 中使用了这个:sqlplus 'system@"//localhost:1521/xe"'
    【解决方案3】:

    只是一个小观察:你一直提到 conn usr\pass,这是一个错字,对吧?因为它应该是 conn usr/pass。还是在基于 Unix 的操作系统上有所不同?

    此外,为了确定:如果您使用 tnsnames,您的登录字符串将与您开始本主题时使用的登录方法不同。

    tnsnames.ora 应该在 $ORACLE_HOME$\network\admin 中。那是您尝试连接的计算机上的 Oracle 主目录,因此在您的情况下是您的 PC。如果您有多个 oracle_homes 并且希望只使用一个 tnsnames.ora,您可以设置环境变量 tns_admin(例如设置 TNS_ADMIN=c:\oracle\tns),并将 tnsnames.ora 放在该目录中。

    您的原始登录方法 (usr/pwd@10.15.240.13:port/servicename) 应该始终有效。到目前为止,我认为您已经掌握了所有信息,除了端口号,我相信您的 DBA 能够提供给您。如果此方法仍然不起作用,则可能是您的客户端无法获得服务器的 IP 地址,或者是防火墙问题(阻止某个端口),或者与 Oracle 或 SQL*Plus 不(直接)相关的其他问题。

    hth! 问候, 雷姆科

    【讨论】:

    • 我的机器上没有安装 oracle。我只有 sqlplus 可执行文件。没有其他的。 OTOH,我确实相信防火墙可能会挡道。
    【解决方案4】:

    您缺少服务名称:

     SQL> connect username/password@hostname:port/SERVICENAME
    

    编辑

    如果您可以从其他计算机连接到数据库,请尝试在那里运行:

    select sys_context('USERENV','SERVICE_NAME') from dual
    

    select sys_context('USERENV','SID') from dual
    

    【讨论】:

    • 好的!现在,我如何发现给定 IP 地址的 oracle 服务器的服务名称?
    • 检查数据库服务器上的 listener.ora 文件。 docs.oracle.com/cd/E11882_01/network.112/e10835/…
    • 我没有登录服务器的权限,只是一个可以读取我需要的一些表的用户ID。但是,我确实可以访问可以使用别名登录的服务器。所以 connect user\pass@alias 工作正常。不过,我想没有办法从打开的连接中发现服务名称。现在我想知道复制tsnames.ora,listener.ora是否足够。 sqlnet.ora 文件到我的电脑。如果我这样做了,我会把它们放在哪里?
    • 我将 tsnames.ora、sqlnet.or 和 listener.ora 从 sqlplus 工作的盒子复制到我自己的机器上。但是,当我尝试连接时,我得到:ORA-12154: TNS:could not resolve the connect identifier specified
    • 打开 tnsnames.ora(它是文本文件)并检查 CONNECT_DATA 应该有 SERVICE_NAME 或 SID。然后尝试使用完整的连接url连接到数据库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 2014-10-25
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    相关资源
    最近更新 更多