我正在通过 zip 文件(根据https://docs.oracle.com/database/121/SQPUG/apd.htm#SQPUG157 )在非 Oracle Linux 主机上设置最小的 Oracle Instant Client并已安装
instantclient-basiclite-linux.x64-12.1.0.2.0.zip
instantclient-sqlplus-linux.x64-12.1.0.2.0.zip
(注意:没有 tnsping 可用)。
我添加了以下环境变量:
ORACLE_SID=prod; export ORACLE_SID
ORACLE_HOME=/local/share/bin/oracle_client/instantclient_12_1; export ORACLE_HOME
SQLPLUS=$ORACLE_HOME/sqlplus; export SQLPLUS
LD_LIBRARY_PATH=$ORACLE_HOME:${LD_LIBRARY_PATH}; export LD_LIBRARY_PATH
TNS_ADMIN=/local/share/oracle/network; export TNS_ADMIN
$TNS_ADMIN/tnsnames.ora 文件由 Oracle 主机提供(我无法更改),可从该非 Oracle 主机读取,并且不包含语法错误(Oracle 主机正在使用它)。具体条目看起来很像这样:
PROD.DOMAIN =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = prod.domain)(PORT = 1234))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = prod)
)
)
也就是说,我无法使用我们首选的方法在命令行上进行连接:
$SQLPLUS user@prod
SQL*Plus: Release 12.1.0.2.0 Production on Mon Dec 14 14:45:22 2015
Copyright (c) 1982, 2014, Oracle. All rights reserved.
Enter password:
ERROR:
ORA-12154: TNS:could not resolve the connect identifier specified
暗示未找到或解析 tnsnames 或...?我相信我已经按照顶部参考文档中的“使用 SQL*Plus Instant Client 连接到数据库”的要求做好了一切准备。
请注意,如果我使用主机名本身,我可以连接:
$SQLPLUS user@\"//prod.domain:1235/prod\"
或 tnsnames 本身的详细信息(证明语法很好):
$SQLPLUS user@"(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=prod.domain)(PORT=1234)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=prod)))"
有任何想法吗?
我当前的解决方法是使用 Perl 将 tnsnames 解析为一组单行和 grep 的第三种方法,用于我想要的实例,但很高兴知道为什么这不起作用以及如何修复它。
谢谢。
感谢 Wernfried Domscheit 将我指向 sqlnet.ora。这个文件在我使用的文档中没有被引用,所以我不知道它存在。在访问 Oracle 主机并在 $ORACLE_HOME/network/admin 中找到文件后,我将其复制到 $TNS_ADMIN 目录并通过测试将其最小化为一个设置(不需要其他设置) Wernfried 引用:
和我喜欢的连接方法
成功了。我将与 Oracle DBA 讨论此文件,并将其正确包含在此共享目录中。