您好,我在通过隧道从我们的数据中心访问 Oracle DB 时遇到问题。
我们有一个非常标准的数据中心,其中一台机器可以从外部访问(我将它的 IP 作为 dc 放在 /etc/hosts 文件中)和内部的 Oracle DB。我们oracle数据库的内网IP地址是192.168.1.7
要创建隧道,我使用以下命令:
ssh -L 1521:192.168.1.7:1521 root@dc
当然它可以工作(有时我还会添加一些 debug -vv 以查看是否有任何东西通过)。
现在是困难的部分 - 连接到 Oracle。我安装了即时客户端 11.2。我的 tnsnames.ora 看起来像这样:
testdb =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = dbname)
)
)
当我尝试使用以下命令进行连接时:
./sqlplus username/pass@testdb
它开始通过隧道连接(我在 ssh 调试中看到它),但随后它无法告诉:
./sqlplus username/pass@testdb
SQL*Plus: Release 11.2.0.1.0 Production on Wed Jan 13 20:46:07 2010
Copyright (c) 1982, 2009, Oracle. All rights reserved.
ERROR:
ORA-12541: TNS:no listener
Enter user-name:
当我在 Intranet 上尝试执行相同的命令时,它可以工作(显然唯一的区别是在 tnsnames.ora HOST 中我们有 192.168.1.7 而不是 localhost)。
我还尝试使用简单的命令行:
./sqlplus username/pass@//localhost:1521/testdb
或者
./sqlplus username/pass@//localhost:1521/testdb
但没有任何帮助:)
我将不胜感激任何帮助或建议。我是否缺少一些 ssh 标志以使其成为可能?
可能是日志文件:
***********************************************************************
Fatal NI connect error 12541, connecting to:
(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=DBNAME)(CID=(PROGRAM=sqlplus@velvet)(HOST=velvet)(USER=johndoe))))
VERSION INFORMATION:
TNS for Linux: Version 11.2.0.1.0 - Production
TCP/IP NT Protocol Adapter for Linux: Version 11.2.0.1.0 - Production
Time: 13-JAN-2010 20:48:42
Tracing not turned on.
Tns error struct:
ns main err code: 12541
TNS-12541: Message 12541 not found; No message file for product=network, facility=TNS
ns secondary err code: 12560
nt main err code: 511
TNS-00511: Message 511 not found; No message file for product=network, facility=TNS
nt secondary err code: 111
nt OS err code: 0
其中 velvet 是我的本地主机名,johndoe 是我的本地用户名。为什么会发送到对方?
更新:
在从数据中心内部进行了更多调查之后,它看起来像:-第一个连接将转到端口 1521-但随后 sqlplus 被重定向到端口号 > 3300,每次都不同并递增 3(至少几次尝试我有) - 当我们试图通过隧道连接时,sqlplus 将尝试连接到 localhost,它显然会失败
所以错误“No Listener”可能来自我们没有重定向这些端口的事实。有什么方法(可能是 tnsnames.ora 文件中的某个选项)强制使用某些特定端口?