通过ssh隧道使用oracle db。错误“ORA-12541:TNS:没有听众”

时间:2010-01-13 20:00:40

标签: oracle ssh sqlplus tunnel ora-12541

您好我通过隧道从数据中心访问Oracle DB时遇到问题。

我们有一个非常标准的数据中心,一台机器可以从外部访问 (我把它的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。我安装了instantclient 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文件中的某个选项)强制使用某个特定端口?

7 个答案:

答案 0 :(得分:3)

通常这应该有效。我不会使用默认侦听器端口作为ssh隧道的条目,但这不应该是问题。我也不会使用root帐户来创建ssh连接,最好是专用的常规帐户。您使用共享服务器还是数据库恰好是具有负载平衡配置的RAC数据库? 一个很好的解释是How can I connect to ORACLE DB through ssh tunnel chain (double tunnel, server in company network) ?,有点复杂......

<强>更新 checkout DbVisualizer,它现在集成了ssh隧道。我认为至少值得一试是值得的。它不是免费的,而是好的。多平台和多数据库,非常灵活。

答案 1 :(得分:3)

查看Metalink ID 361284.1(编辑:实际上不公开,但找到信息here

似乎Oracle Connection Manager是您的选择。它基本上处理端口重定向在防火墙内。我以前没用过,所以不能再告诉你了。


更新:另一种方法是使用MTS,为某些端口配置调度程序并在防火墙中打开这些端口。您不必为此安装其他软件,但通过共享服务器连接可能需要增加LARGE_POOL_SIZE,以及其他考虑因素。因此,您仍需要DBA角色来更改DISPATCHERS参数。你还必须反弹数据库。

答案 2 :(得分:1)

在我的情况下,问题在于数据库服务器具有多个IP,而当我使用SSH隧道时,它正在连接到错误的另一个IP。

因此,请尝试检查目标IP是否与数据库服务器上的listener.ora文件中的IP相同。

答案 3 :(得分:0)

您是否可以尝试进行跟踪以确切地确定发生了什么:

  • 对于服务器跟踪,请尝试here(小心!将跟踪所有新请求,并且服务器可以折叠)。
  • 对于客户端跟踪,请结帐here

答案 4 :(得分:0)

MJ!您的隧道仅用于初始tcp连接,您自己的LISTEN端口未进行隧道连接,并且可能未实现。防火墙应该允许连接回你,类似于活动FTP。 从“构建Internet防火墙”2 / E第23章段落:Oracle SQL * Net和Net8的第670页开始,相当广泛地记录了Oracle的所有端口。您可以在SafariBooksOnline.com

上查看

ISBN 1565928718

答案 5 :(得分:-1)

也许你的听众尚未开始。尝试运行“ lsnrctrl start ”命令。

答案 6 :(得分:-1)

这里也有一个很好的解释connection to an oracle database though a SSH secure shell对我有用。

  
      
  1. 打开putty并在会话页面上输入服务器名称并确保已选中SSH。服务器可以是您拥有的任何服务器   用户名和密码登录。我在这里使用一个名为BLUEBIRD的   我拥有它!

  2.   
  3. 在connection-&gt; ssh-&gt;隧道页面上,取消选中顶部的两个选项(“本地端口接受...”和“远程端口执行相同操作”)。

  4.   
  5. 输入9999(或1024以上的任何端口作为源端口。

  6.   
  7. 在目标中,根据tnsnames输入数据库主机和端口。在我的例子中,这是一个名为GREENBIRD的服务器和一个

  8. 的端口   
  9. 将其输入为server:port。

  10.   
  11. 由于正在转发的端口位于桌面上,请选中“本地”选项。保留“自动”以及IP版本。

  12.   
  13. 单击“添加”按钮。您将在转发端口列表中看到L9999 greenbird:1521(您将有所不同)。

  14.   
  15. 再次转到会话页面,输入已保存会话的名称,然后单击“保存”。

  16.   
  17. 点击“打开”。提供服务器的用户名和密码(在我的情况下为BLUEBIRD)。您将登录到名为的服务器的正常ssh会话   BLUEBIRD。

  18.