7 Stimmen

Verwendung der Oracle-DB über einen SSH-Tunnel. Fehler "ORA-12541: TNS:no listener"

Hallo, ich habe ein Problem mit dem Zugriff auf Oracle DB von unserem Rechenzentrum durch einen Tunnel.

Wir haben ein ziemlich normales Rechenzentrum mit einem Rechner, der von außen zugänglich ist (ich habe seine IP in die Datei /etc/hosts als dc eingetragen) und die Oracle-Datenbank im Inneren. Die IP-Adresse unserer Oracle-Datenbank im internen Netzwerk lautet 192.168.1.7

Um einen Tunnel zu erstellen, verwende ich den Befehl:

 ssh -L 1521:192.168.1.7:1521 root@dc

und natürlich funktioniert es (manchmal füge ich auch ein Debug -vv hinzu, um zu sehen, ob etwas durchläuft).

Jetzt kommt der schwierige Teil - die Verbindung zu Oracle. Ich habe instantclient 11.2. installiert und meine tnsnames.ora sieht so aus:

testdb =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = dbname)
    )
  )

Und wenn ich versuche, eine Verbindung mit dem Befehl:

./sqlplus username/pass@testdb

Die Verbindung wird durch den Tunnel hergestellt (ich sehe es im ssh-Debug), aber dann schlägt sie fehl erzählt:

./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: 

Wenn ich versuche, denselben Befehl auszuführen, wenn ich mich im Intranet befinde, funktioniert es (der einzige Unterschied ist offensichtlich, dass in der tnsnames.ora HOST 192.168.1.7 und nicht localhost steht).

Ich habe auch versucht, die einfache Befehlszeile zu verwenden:

./sqlplus username/pass@//localhost:1521/testdb

oder alternativ

./sqlplus username/pass@//localhost:1521/testdb

Aber nichts hat geholfen :)

Ich würde mich über jede Hilfe oder Anregung freuen. Fehlt mir ein ssh-Flag, um dies zu ermöglichen?

Wahrscheinlich die Protokolldatei:

***********************************************************************

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

wobei velvet mein lokaler Hostname und johndoe mein lokaler Benutzername ist. Warum wird sie an die andere Seite gesendet?

UPDATE:

Nach der Untersuchung ein wenig mehr von innerhalb Rechenzentrum und es sieht aus wie: - die erste Verbindung geht an den Port 1521 - aber dann wird Sqlplus auf die Portnummer > 3300 umgeleitet, die jedes Mal anders ist und sich um 3 erhöht (zumindest bei den wenigen Versuchen, die ich hatte) - wenn wir versuchen, eine Verbindung über einen Tunnel herzustellen, versucht sqlplus, sich mit localhost zu verbinden, was natürlich fehlschlägt

Der Fehler "No Listener" kommt also wahrscheinlich daher, dass wir diese Ports nicht umleiten. Gibt es eine Möglichkeit (wahrscheinlich eine Option in der Datei tnsnames.ora), die Verwendung eines bestimmten Ports zu erzwingen?

0 Stimmen

Was ist das Betriebssystem des Datenbankservers? Wenn es Windows ist, Google USE_SHARED_SOCKET

0 Stimmen

Haben Sie jemals eine Lösung für dieses Problem gefunden?

0 Stimmen

Um zu verdeutlichen: Ich stelle eine Verbindung zu einem Oracle RAC her, und ich bin nicht in der Lage, den Listener auf der anderen Seite neu zu konfigurieren (z. B. indem ich ihn so einstelle, dass er einen freigegebenen Socket verwendet). sqlplus stellt alle paar Verbindungsversuche eine Verbindung her, meine Anwendung schafft es nie, eine Verbindung herzustellen.

-1voto

i.van Punkte 9

Eine gute Erklärung finden Sie auch hier Verbindung zu einer Oracle-Datenbank über eine sichere SSH-Shell was bei mir funktioniert hat.

  1. Öffnen Sie putty und geben Sie auf der Sitzungsseite den Namen eines Servers ein und stellen Sie sicher, dass SSH aktiviert ist. Der Server kann ein beliebiger Server sein, für den Sie einen Benutzernamen und ein Passwort haben, mit denen Sie sich anmelden können. Ich verwende hier einen Server namens BLUEBIRD. ich ihn besitze!

  2. Deaktivieren Sie auf der Seite connection->ssh->tunnels die beiden oberen Optionen ("Local ports accept ..." und "Remote ports do the same").

  3. Geben Sie 9999 (oder einen beliebigen Port über 1024) als Quellport ein.

  4. Als Ziel geben Sie den Datenbank-Host und den Port gemäß tnsnames an. In meinem Fall ist dies ein Server namens GREENBIRD und ein Port von

  5. Geben Sie dies als Server:Port ein.

  6. Da sich der weitergeleitete Port auf Ihrem Desktop befindet, aktivieren Sie die Option "Lokal". Lassen Sie auch bei der IP-Version "Auto" aktiviert.

  7. Klicken Sie auf die Schaltfläche Hinzufügen. In der Liste der weitergeleiteten Ports sehen Sie L9999 greenbird:1521 (Ihre Version wird abweichen).

  8. Gehen Sie erneut auf die Sitzungsseite, geben Sie einen Namen für Ihre gespeicherte Sitzung ein und klicken Sie auf Speichern.

  9. Klicken Sie auf Öffnen. Geben Sie einen Benutzernamen und ein Passwort für den Server ein (in meinem Fall BLUEBIRD). Sie melden sich mit einer normalen ssh-Sitzung auf dem Server namens BLUEBIRD.

0 Stimmen

Bei weitem nicht. In dieser Frage wird nirgendwo ein Kitt erwähnt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X