こんにちは、データセンターからトンネル経由で Oracle DB にアクセスする際に問題が発生しました。
1 台のマシンが外部からアクセス可能 (私はその 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:
イントラネット上でこの同じコマンドを実行しようとすると、機能します (明らかに唯一の違いは、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にリダイレクトされます。私が持っていた)-トンネルを介して接続しようとすると、sqlplusはlocalhostに接続しようとし、明らかに失敗します
そのため、「リスナーがありません」というエラーは、おそらくこれらのポートをリダイレクトしていないことが原因です。特定のポートを強制的に使用する方法 (おそらく tnsnames.ora ファイルのオプション) はありますか?