Ubuntu Oracle Instant Client tnsnames.ora

时间:2018-10-05 21:03:36

标签: oracle sqlplus tnsnames oracleclient

我最近在Ubuntu 18.04上设置了Oracle Instant Client,并尝试通过sqlplus使用以下命令连接到位于其他服务器上的数据库:

sqlplus username@orcl

我以以下格式编辑了tnsnames.ora文件:

ORCL= 
 (DESCRIPTION= 
   (ADDRESS=(hostname)(PORT=1521))
   (CONNECT_DATA= 
     (SERVICE_NAME=service_name))) 

在我输入密码后,它会收到错误消息:

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

如果要手动输入连接数据,例如

sqlplus username/password@orcl:portnumber/service_name

我将要连接,但我不想输入所有连接数据,而只将其保留为username @ host

我不确定导致错误的原因,也不知道是否需要在托管实际数据库的服务器端编辑任何文件以允许这种连接。谢谢

2 个答案:

答案 0 :(得分:0)

如果像描述的那样失败,则tnsnames.ora文件中条目的service_name错误。

我将tnsnames.ora文件复制到一个文件夹中,并将ORCL中的条目重命名为我的测试所独有的

  

oracle @ befb83f389c6:〜$ mkdir tst oracle @ befb83f389c6:〜$ cp   产品/11.2.0/xe/network/admin/tnsnames.ora tst /   oracle @ befb83f389c6:〜$ vim tst / tnsnames.ora oracle @ befb83f389c6:〜$   猫tst / tnsnames.ora

     

tnsnames.ora网络配置文件:

     

ONLYFORME =(DESCRIPTION =       (地址=(协议= TCP)(主机= befb83f389c6)(端口= 1521))       (CONNECT_DATA =         (服务器=专用)         (SERVICE_NAME = XE)       )

     

EXTPROC_CONNECTION_DATA =(DESCRIPTION =       (ADDRESS_LIST =         (地址=(协议= IPC)(密钥= EXTPROC_FOR_XE))       )       (CONNECT_DATA =         (SID = PLSExtProc)         (表示= RO)       )

     

此时,由于客户端不知道tnsnames.ora文件的副本,tnsping到名称ONLYFORME将会失败

     

oracle @ befb83f389c6:〜$ tnsping ONLYFORME

     

适用于Linux的TNS Ping实用程序:版本11.2.0.2.0-在以下版本上生产   06-OCT-2018 12:18:51

     

版权(c)1997、2011,Oracle。保留所有权利。

     

使用的参数文件:

     

TNS-03505:无法解析名称

为了补偿,我们将TNS_ADMIN环境变量设置为

  

oracle @ befb83f389c6:〜$ export TNS_ADMIN = / u01 / app / oracle / tst /   oracle @ befb83f389c6:〜$ tnsping ONLYFORME

     

适用于Linux的TNS Ping实用程序:版本11.2.0.2.0-在以下版本上生产   06-OCT-2018 12:19:16

     

版权(c)1997、2011,Oracle。保留所有权利。

     

使用的参数文件:

     

使用TNSNAMES适配器解析别名尝试联系   (说明=(地址=(协议= TCP)(主机= befb83f389c6)(端口=   1521))(CONNECT_DATA =(服务器=专用)(SERVICE_NAME = XE)))   (0毫秒)oracle @ befb83f389c6:〜$

现在转到ONLYFORME作品

使用该名称与sqlplus连接也可以正常工作

  

oracle @ befb83f389c6:〜$ sqlplus iasim @ ONLYFORME

     

SQL * Plus:11.2.0.2.0发布于2018年10月6日星期六12:22:43

     

版权(c)1982,2011,Oracle。保留所有权利。

     

输入密码:

     

已连接到:Oracle Database 11g Express Edition版本11.2.0.2.0-   64位生产

     

SQL>

为重现您收到的错误,我们可能输入了未知的服务名称

  

oracle @ befb83f389c6:〜$ cat tst / tnsnames.ora

     

tnsnames.ora网络配置文件:

     

ONLYFORME =(DESCRIPTION =       (地址=(协议= TCP)(主机= befb83f389c6)(端口= 1521))       (CONNECT_DATA =         (服务器=专用)         (SERVICE_NAME = UNKNOWN_XE)       )

     

EXTPROC_CONNECTION_DATA =(DESCRIPTION =       (ADDRESS_LIST =         (地址=(协议= IPC)(密钥= EXTPROC_FOR_XE))       )       (CONNECT_DATA =         (SID = PLSExtProc)         (表示= RO)       )

     

oracle @ befb83f389c6:〜$ sqlplus iasim @ ONLYFORME

     

SQL * Plus:2018年10月6日星期六12:25:17发布11.2.0.2.0版

     

版权(c)1982,2011,Oracle。保留所有权利。

     

输入密码:错误:ORA-12514:TNS:侦听器当前不   知道连接描述符中请求的服务

     

输入用户名:

在这一点上,我们知道哪个tnsnames.ora文件可以解析我们正在使用的tnsname(ONLYFORME),并且我们知道错误在哪里

希望这对您有帮助...

答案 1 :(得分:0)

假设您不想输入密码;

此方法通常由dba来完成,后者以ssh用户身份直接登录到该特定服务器/主机,其中,其密码存储为散列专用/公共密钥 (不是来自远程计算机)

更简单的方法是使用像sqlplus username / password @ remote_host_ip:1521 / orcl 最好在上面的kshrc / bashrc文件中创建别名(并提供别名),以便您通过较少的击键即可获得所需的内容。

例如: 纳米.bashrc 别名tosql ='sqlplus用户名/密码@remote_host_ip:1521 / orcl'