我最近在 Ubuntu 18.04 上设置了 Oracle Instant Client,并尝试使用以下命令通过 sqlplus 连接到位于不同服务器上的数据库:
sqlplus username@orcl
我以以下格式编辑了我的 tnsnames.ora 文件:
ORCL= (描述= (地址=(主机名((端口=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
我不确定是什么导致了错误,也不知道我是否需要在托管实际数据库的服务器端编辑任何文件以允许这样的连接。谢谢
如果它像描述的那样失败,则 tnsnames.ora 文件中条目的service_name是错误的。
我会将 tnsnames.ora 文件复制到一个文件夹中,并将 ORCL 中的条目重命名为我的测试的唯一名称
oracle@befb83f389c6:~$ MKDIR tst oracle@befb83f389c6:~$ cp product/11.2.0/xe/network/admin/tnsnames.ora tst/oracle@befb83f389c6:~$ vim tst/tnsnames.ora oracle@befb83f389c6:~$ cat tst/tnsnames.ora
tnsnames.ora 网络配置文件:
ONLYFORME = (描述 = (地址 = (协议 = TCP((主机 = befb83f389c6((端口 = 1521(( (CONNECT_DATA = (服务器 = 专用( (SERVICE_NAME = XE( ) )
EXTPROC_CONNECTION_DATA = (描述 = (ADDRESS_LIST = (地址 = (协议 = IPC((密钥 = EXTPROC_FOR_XE(( ) (CONNECT_DATA = (SID = PLSExtProc( (演示文稿 = RO( ) )
此时,tnsping 到名称 ONLYFORME 将失败,因为客户端不知道 tnsnames.ora 文件的副本
oracle@befb83f389c6:~$ tnsping ONLYFORME
适用于 Linux 的 TNS Ping 实用程序:版本 11.2.0.2.0 - 生产 06-10月-2018 12:18:51
版权所有 (c( 1997, 2011, 甲骨文. 保留所有权利。
使用的参数文件:
TNS-03505:无法解析名称
为了补偿,我们将环境TNS_ADMIN设置为可Varaiable
oracle@befb83f389c6:~$ export TNS_ADMIN=/u01/app/oracle/tst/oracle@befb83f389c6:~$ tnsping ONLYFORME
适用于 Linux 的 TNS Ping 实用程序:版本 11.2.0.2.0 - 生产 06-10月-2018 12:19:16
版权所有 (c( 1997, 2011, 甲骨文. 保留所有权利。
使用的参数文件:
已使用 TNSNAMES 适配器解析别名 尝试联系 (描述 = (地址 = (协议 = TCP((主机 = befb83f389c6((端口 = 1521(( (CONNECT_DATA = (服务器 = 专用( (SERVICE_NAME = XE(((还行 (0 毫秒( oracle@befb83f389c6:~$
现在tnsping到ONLYFORME作品
使用此名称与SQLplus连接也可以正常工作
oracle@befb83f389c6:~$ sqlplus iasim@ONLYFORME
SQL*Plus:2018 年 10 月 6 日星期六 12:22:43 发布版本 11.2.0.2.0
生产版权所有 (c( 1982, 2011, 甲骨文. 保留所有权利。
输入密码:
连接到:Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64位生产
SQL>
为了重现您收到的错误,我们可能会输入一个未知的服务名称
oracle@befb83f389c6:~$ cat tst/tnsnames.ora
tnsnames.ora 网络配置文件:
ONLYFORME = (描述 = (地址 = (协议 = TCP((主机 = befb83f389c6((端口 = 1521(( (CONNECT_DATA = (服务器 = 专用( (SERVICE_NAME = UNKNOWN_XE( ) )
EXTPROC_CONNECTION_DATA = (描述 = (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, 甲骨文. 保留所有权利。
输入密码: 错误: ORA-12514: TNS:侦听器当前没有 了解连接描述符中请求的服务
输入用户名:
在这一点上,我们知道是哪个tnsnames.ora文件解析了我们正在使用的tnsname(ONLYFORME(,我们知道错误在哪里
希望这有帮助...
假设您不想输入密码;
此方法通常由DBA的直接登录到该特定服务器/主机的DSH用户完成,其中他们的密码存储为散列私钥/公钥 (不是从远程计算机(
更简单的方法是使用 SQLPLUS 用户名/password@remote_host_ip:1521/ORCL 更好的是在您的 kshrc/bashrc 文件中创建别名(并获取它们(以进行上述操作,以便您以更少的击键获得所需的内容。
例如: 纳米 .巴什尔克 alias tosql='sqlplus username/password@remote_host_ip:1521/orcl'