通过 ssh 隧道使用 oracle db。错误“ORA-12541:TNS:没有侦听器”
Posted
技术标签:
【中文标题】通过 ssh 隧道使用 oracle db。错误“ORA-12541:TNS:没有侦听器”【英文标题】:Using oracle db through ssh tunnel. Error "ORA-12541: TNS:no listener" 【发布时间】:2011-01-04 19:29:22 【问题描述】:您好,我在通过隧道从我们的数据中心访问 Oracle 数据库时遇到问题。
我们有一个非常标准的数据中心,其中一台机器可以从外部访问 (我把它的IP放在/etc/hosts文件中作为dc)和里面的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 文件中的某个选项)强制使用某些特定端口?
【问题讨论】:
数据库服务器的操作系统是什么?如果是 Windows,Google USE_SHARED_SOCKET 也打这个;你找到解决方案了吗? 澄清一下:我正在连接到 Oracle RAC,我无法重新配置另一端的侦听器(例如将其设置为使用共享套接字)。 sqlplus 每隔几次连接尝试就会连接一次,我的应用程序永远无法连接。 到目前为止我的解决方案:在循环中重新连接直到成功,因为有时您不会被重定向。 叹息 @MartijnPieters - 你在使用虚拟机吗?另外,哪个操作系统,哪个版本的数据库? 【参考方案1】:查看 Metalink ID 361284.1(编辑:实际上不公开,但找到信息 here)
Oracle Connection Manager 似乎是您的选择。它基本上处理防火墙内的端口重定向。我以前没用过,所以不能再给你建议了。
更新:另一种方法是使用 MTS,为调度程序配置某些端口并在防火墙中打开这些端口。您不必为此安装其他软件,但通过共享服务器连接可能需要增加 LARGE_POOL_SIZE 以及其他考虑因素。因此,您仍然需要 DBA 角色来更改 DISPATCHERS 参数。您还必须退回数据库。
【讨论】:
不幸的是,我没有在服务器端添加任何东西的选项,更不用说防火墙了。不过,我之前确实阅读过有关 Oracle 连接管理器的信息,如果您能够设置它,这听起来确实是处理连接时重定向的好选择。【参考方案2】:通常这应该有效。我不会使用默认侦听器端口作为 ssh 隧道的条目,但这应该不是问题。我也不会使用 root 帐户来创建 ssh 连接,最好是专用的常规帐户。您是在使用共享服务器还是数据库恰好是具有负载平衡配置的 RAC 数据库? 一个很好的解释在这里How can I connect to ORACLE DB through ssh tunnel chain (double tunnel, server in company network) ?,有点复杂.....
更新 结帐DbVisualizer,它现在已经集成了 ssh 隧道。我认为至少值得一试。它不是免费的,但很好。多平台多数据库,非常灵活。
【讨论】:
【参考方案3】:在我的情况下,问题是数据库服务器有多个 IP,当我使用 SSH 隧道时,它连接到错误的不同 IP。
所以试着检查一下,目的IP是否与DB服务器上listener.ora文件中的IP相同。
【讨论】:
【参考方案4】:您能否尝试进行跟踪以确定正在发生的确切情况:
对于服务器跟踪,请尝试here(小心!所有新请求都将被跟踪,服务器可能会崩溃)。 对于客户端跟踪,请查看here。【讨论】:
【参考方案5】:乔丹!您的隧道仅用于初始 tcp 连接,您自己的 LISTEN 端口没有隧道化,并且可能未实现。防火墙应该允许连接回您,类似于活动 FTP。 从“Building Internet Firewalls”2/E 第 23 章第 670 页开始,Oracle 的所有端口都得到了广泛的记录,段落:Oracle SQL*Net 和 Net8。您可以在SafariBooksOnline.com查看它
国际标准书号 1565928718
【讨论】:
【参考方案6】:也许你的监听器还没有开始。尝试运行“lsnrctrl start”命令。
【讨论】:
不,监听器肯定已经开始了;请注意“sqlplus 每隔几次连接尝试就会连接一次”。【参考方案7】:connection to an oracle database though a SSH secure shell 也有一个很好的解释,它对我有用。
打开 putty 并在会话页面上,输入服务器的名称并确保选中 SSH。服务器可以是您拥有的任何服务器 用于登录的用户名和密码。我在这里使用一种叫做 BLUEBIRD 作为 我拥有它!
在 connection->ssh->tunnels 页面上,取消选中顶部的两个选项(“本地端口接受 ...”和“远程端口也一样”)。
输入 9999(或 1024 以上的任何端口作为源端口。
在目的地,根据 tnsnames 输入数据库主机和端口。就我而言,这是一个名为 GREENBIRD 的服务器和一个端口
将其输入为 server:port。
由于被转发的端口在您的桌面上,请选中“本地”选项。为 IP 版本保留“自动”选项。
单击添加按钮。您将在转发端口列表中看到 L9999 greenbird:1521(您会有所不同)。
再次进入会话页面,输入已保存会话的名称并点击保存。
点击打开。提供服务器的用户名和密码(在我的例子中是 BLUEBIRD)。您将登录到名为的服务器的正常 ssh 会话 蓝鸟。
【讨论】:
暂时关闭。在这个问题中没有提到腻子。以上是关于通过 ssh 隧道使用 oracle db。错误“ORA-12541:TNS:没有侦听器”的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 ssh 隧道链(双隧道,公司网络中的服务器)连接到 Oracle Database 11g 服务器?
无法从我的 linux shell 打开 ssh 隧道(EC2 暴露 RDS db)
使用 SSH 隧道时无法通过套接字错误连接到本地 MySQL 服务器