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.

3voto

ik_zelf Punkte 5982

Normalerweise sollte das funktionieren. Ich würde keinen Standard-Listener-Port als Eintrag für den ssh-Tunnel verwenden, aber das sollte nicht das Problem sein. Ich würde auch nicht das Root-Konto verwenden, um die ssh-Verbindung herzustellen, sondern vorzugsweise ein eigenes reguläres Konto. Verwenden Sie gemeinsam genutzte Server oder handelt es sich bei der Datenbank um eine RAC-Datenbank mit einer Lastausgleichskonfiguration? Eine gute Erklärung finden Sie hier Wie kann ich mich über eine ssh-Tunnelkette (doppelter Tunnel, Server im Firmennetzwerk) mit ORACLE DB verbinden? ein wenig komplizierter .....

Update Zur Kasse DbVisualizer hat es jetzt eine integrierte ssh-Tunneling-Funktion. Ich denke, es lohnt sich, es zumindest auszuprobieren. Es ist nicht kostenlos, aber gut. Multi-Plattform und Multi-Datenbank und sehr flexibel.

3voto

HAL 9000 Punkte 3757

Sehen Sie sich Metalink ID an 361284.1 (Edit: tatsächlich nicht öffentlich, aber die Info ist zu finden aquí )

Es scheint, dass Oracle Connection Manager die richtige Wahl für Sie wäre. Er kümmert sich grundsätzlich um die Portumleitungen innerhalb der Firewall . Ich habe es noch nie benutzt und kann Sie daher nicht weiter beraten.


Aktualisierung: Eine andere Möglichkeit wäre, MTS zu verwenden, Dispatcher mit bestimmten Ports zu konfigurieren und diese Ports in der Firewall zu öffnen. Sie müssten dafür keine zusätzliche Software installieren, aber für eine Verbindung über einen gemeinsam genutzten Server müsste unter anderem LARGE_POOL_SIZE erhöht werden. Sie benötigen also immer noch die DBA-Rolle, um den Parameter DISPATCHERS zu ändern. Außerdem müssen Sie die DB bouncen.

0 Stimmen

Leider habe ich nicht die Möglichkeit, etwas auf der Serverseite hinzuzufügen, geschweige denn die Firewall. Ich habe allerdings schon einmal über den Oracle Connection Manager gelesen, und wenn Sie in der Lage sind, ihn einzurichten, ist das sicherlich eine gute Option, um die Umleitung beim Verbindungsaufbau zu umgehen.

0voto

FerranB Punkte 33783

Können Sie versuchen, eine Aufzeichnung zu erstellen, um genau festzustellen, was passiert:

  • Versuchen Sie für den Server-Trace aquí (Vorsicht! Alle neuen Anfragen werden aufgezeichnet und der Server kann zusammenbrechen).
  • Für Client-Trace, siehe aquí .

0voto

bbaassssiiee Punkte 5424

MJ! Ihr Tunnel ist nur für die erste TCP-Verbindung gedacht, Ihr eigener LISTEN-Port ist nicht getunnelt und wahrscheinlich nicht implementiert. Die Firewall sollte eine Verbindung zurück zu Ihnen erlauben, ähnlich wie bei aktivem FTP. Alle Ports für Oracle sind ab Seite 670 in "Building Internet Firewalls" 2/E Kapitel 23, Absatz ausführlich dokumentiert: Oracle SQL*Net und Net8. Sie können sie einsehen unter SafariBooksOnline.de

ISBN 1565928718

-1voto

lepike Punkte 726

Vielleicht wurde Ihr Hörer noch nicht gestartet. Versuchen Sie " lsnrctrl starten Befehl".

0 Stimmen

Nein, der Listener ist definitiv gestartet; beachten Sie den Hinweis "sqlplus verbindet sich einmal alle paar Verbindungsversuche".

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