Frage

Borderline-ServerFault-Frage, aber ich dachte, ich versuche es zuerst hier, da ich in der Vergangenheit mit Oracle-Fragen Glück hatte.

Ich versuche, über PHP eine Verbindung zu einer Oracle-Datenbank herzustellen, und erhalte die folgende Fehlermeldung.

ORA-12505: TNS:listener does not currently know of SID given in connect descriptor

Dies ist der Fehler, den PHP meldet und der im listener.log von Oracle angezeigt wird.

Mein unmittelbares Problem besteht darin, diesen Fehler zu beheben.Die größere Frage, die ich gerne beantwortet hätte, lautet: Wie funktioniert das Oracle-Verbindungsmodell?

Dies geschieht in einer Entwicklungsumgebung, die auf meinem lokalen Windows-Rechner läuft und bis jetzt funktioniert.Leider wurde mir die Umgebung übergeben (ich habe sie nicht eingerichtet) und die Leute, die tat Setup-Einstellungen sind nicht verfügbar, um mir beim Debuggen zu helfen.

Wenn ich bei MySQL oder PostgreSQL (zwei Systeme, mit denen ich besser vertraut bin) einen ähnlichen Fehler erhalte, prüfe ich, ob ein Datenbankprozess ausgeführt wird, und versuche dann, manuell eine Verbindung zur Datenbank herzustellen, indem ich Benutzername/Passwort verwende. Verbindungszeichenfolge.Leider bin ich mit den Oracle-Tools unter Windows nicht vertraut (außer SQL Developer) und weiß nicht, was ein TNS:Listener oder eine SID im Kontext von Oracle ist (ich habe vage Vorstellungen, aber vage Vorstellungen helfen selten, wenn Sie debuggen so etwas)

Für allgemeine Ratschläge wäre ich dankbar.

Aktualisierungen pro Kommentar:

In meiner Datei tnsnames.ora gibt es eine Reihe von Einträgen, der relevante Eintrag lautet

OBS2 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = steel-ae39650)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = OBS2)
    )
  )

Dies wird in der Liste der Instanzen, die ich ausführe, nicht angezeigt

    LSNRCTL> services

Daher denke ich, dass meine nächste Frage lautet: Wie versuche ich, die OBS2-Instanz manuell zu starten?

War es hilfreich?

Lösung

Ein TNS-Name ist wie ein Alias ​​für Ihre Dienstinstanz.Der TNS-Listener-Dienst dient Ihnen dabei als eine Art Suchdienst.Der Vorgang schlägt mit dieser Fehlermeldung fehl, wenn der eigentliche Dienst, zu dem Sie über einen TNS-Namen eine Verbindung herstellen möchten, ungültig ist.

Anschließend können Sie mithilfe des Befehlszeilentools testen, ob der TNS-Listener den Dienst korrekt erkennt:

%>lsnrctl services

Was etwa Folgendes ausgeben sollte:

Service "myservice" has 1 instance(s).
  Instance "myinstance", status READY, has 1 handler(s) for this service...
    Handler(s):
      "D000" established:0 refused:0 current:0 max:1002 state:ready
         DISPATCHER <machine: LOCALHOST, pid: 12345>
         (ADDRESS=(PROTOCOL=tcp)(HOST=LOCALHOST)(PORT=6789))

Können Sie bitte den entsprechenden TNS-Eintrag posten (im tnsnames.ora Datei)?Es befindet sich in ORAHOME\client oder db\ADMIN ETWORK.Wenn Sie sowohl einen Client als auch einen Server haben, stellen Sie sicher, dass beide Kopien davon vorhanden sind tnsnames.ora Die Werte der Datei sind aus Sicherheitsgründen korrekt.

Hier ist ein Beispiel für eine ordnungsgemäße TNS-Namensdefinition in tnsnames.ora namens 'mydb':

myDbAlias =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 12345)(QUEUESIZE = 100))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = myservice)
    )
  )

Andere Tipps

Ich wollte das nur hinzufügen, da ich kürzlich ein ähnliches Verbindungsproblem hatte, das mich verrückt machte, bis ich herausfand, was passiert ist.

Erstens sind die Schlüsselwörter SID und service_name nicht genau gleich. Dies war meine erste falsche Annahme. In vielen Umgebungen können Sie SID und Service_Name austauschen, aber nicht immer, es hängt davon ab.

Ihr Fehler verschenkt jedoch das Problem: Sie geben an Sid in einer Verbindungszeichenfolge statt der DIENSTNAME Dass tnsnamen erfolgreich verwendet werden.

Wenn Sie also die Verbindungszeichenfolge in Ihrem Code angeben, verwenden Sie das Schlüsselwort Service_Name in der Connect -Zeichenfolge (*oder, wenn Sie bereits service_name verwendet und keine Verbindung hergestellt werden können, verwenden Sie SID -Schlüsselwort*).

Übermäßig vereinfachende Antwort Ich kenne, aber leicht zu versuchen und kann jemandem einige Kopfschmerzen ersparen.

Ich hoffe, das hilft.

Die Antwort von Mike Atlas ist ziemlich umfassend, aber beachten Sie, dass Sie eine Verbindung zu 10G (oder später) DBs herstellen können, die keinen veröffentlichten TNSNAME mit [//] host_name [: port] [/service_name] haben können.

HTH

C.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top