2010-01-25 9 views
8

Borderline ServerFault Frage, aber ich dachte, ich würde hier zuerst versuchen, da ich in der Vergangenheit mit Oracle-Fragen Glück hatte.Was ist ein TNS: Listener im Kontext von Oracle?

Ich versuche, eine Verbindung zu einer Oracle-Datenbank von PHP herzustellen, und ich bekomme den folgenden Fehler.

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

Dies ist der Fehler, den PHP meldet, und der Fehler, der in Oracles Listener.log angezeigt wird.

Mein direktes Problem ist die Behebung dieses Fehlers. Die größere Frage, die ich beantworten möchte, ist, wie Oracle Verbindungsmodell funktioniert?

Dies ist in einer Entwicklungsumgebung, die auf meinem lokalen Windows-Rechner läuft und hat bis jetzt gearbeitet. Leider wurde mir die Umgebung übergeben (ich habe es nicht eingerichtet) und die Leute, die eingerichtet haben, sind nicht verfügbar, um mir beim Debuggen zu helfen.

Wenn ich einen ähnlichen Fehler mit MySQL oder PostgreSQL (zwei Systeme, mit denen ich vertraut bin) bekomme, würde ich überprüfen, dass ein Datenbankprozess ausgeführt wurde, und dann versuchen, manuell mit der Datenbank zu verbinden Benutzername/Passwort/Verbindungszeichenfolge. Leider sind mir die Oracle-Tools unter Windows (außer SQL Developer) nicht vertraut und ich weiß nicht, was ein TNS: Listener oder SID im Kontext von Oracle ist (ich habe vage Ideen, aber vage Ideen helfen selten wenn Sie debuggen etwas wie das)

Jeder allgemeine Hinweis wäre willkommen.

Updates pro Kommentare:

eine Reihe von entires in meiner Datei tnsnames.ora Es ist der entsprechende Eintrag

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

Dies ist nicht in der Liste der Instanzen reflektiert wird, wenn ich

laufen

Also ich denke meine nächste Frage ist, wie versuche ich, die OBS2-Instanz manuell zu starten?

+1

Ein TNS-Eintrag ist Teil der Verbindungszeichenfolge zu Oracle. –

Antwort

7

Ein TNS-Name ist wie ein Alias ​​für Ihre Dienstinstanz. Der TNS-Listener-Dienst fungiert in dieser Hinsicht als eine Art Nachschlagedienst für Sie. Es wird mit dieser Fehlermeldung fehlschlagen, wenn der tatsächliche Dienst, mit dem Sie versuchen, eine Verbindung über einen TNS-Namen herzustellen, nicht gültig ist.

können Sie dann testen, um zu sehen, ob der TNS Listener das Kommandozeilen-Tool den Dienst sieht richtig mit:

%>lsnrctl services 

Welche ausgeben sollte in etwa wie folgt:

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 relevanten TNS-Eintrag (in der tnsnames.ora Datei) veröffentlichen? Es befindet sich in ORAHOME \ client oder db \ ADMIN \ NETWORK. Wenn Sie sowohl Client als auch Server haben, stellen Sie sicher, dass beide Kopien der Datei tnsnames.ora korrekte Werte haben, nur um sicher zu sein.

Hier ist ein Beispiel eines Eigennamens Definition TNS in tnsnames.ora 'mydb' genannt:

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

Aktualisierte Frage mit relevanten Informationen. Es sieht so aus, als ob der relevante TNS-Eintrag nicht im Listener reflektiert wird. Gibt es eine Möglichkeit, eine TNS-Instanz manuell zu starten? Auch möglich relevant; Wenn ich dbca verwende und versuche, "Datenbankoptionen konfigurieren" für die Datenbank/das Schema (rechte Bezeichnung?) In Frage zu stellen, erhalte ich den folgenden Fehler: ORA-02778: Name, der für das Protokollverzeichnis angegeben wird, ist ungültig. Ich habe mein Problem gelöst, indem ich eine neue Datenbank erstellt und einen aktuellen Dump importiert habe, aber ich wäre immer noch an Debugging-Techniken für diese Art von Dingen interessiert. –

+0

Sie haben angegeben, dass Sie sich in Windows befinden. Daher sollten Sie feststellen können, ob der Dienst in der Snap-In-Komponente für Windows-Dienste ausgeführt wird. Start-> Admin-Tools-> Dienste. Schau, ob der OracleServiceOBS2 (ich vermute diesen Namen, könnte es anders sein). Dann starte es von dort aus. Ihr TNS-Listener-Service ist genau dort, benannt nach OracleOraDb10g_home_1TNSListener. –

+1

Also, ich denke, was mich hier verwirrt, ist, wie eine Oracle-Datenbank aufgebaut sein kann, aber eine andere nicht. Das heißt, als ich die Dienste aufgelistet habe, die ich gesehen habe, waren die anderen Datenbanken (OBS3, OBS4 usw.) oben. Werden alle Datenbanken von OracleServiceOBS2 kontrolliert oder erhält jede Datenbank ihren eigenen OracleServiceOBS2? (Entschuldigung, wenn das keinen Sinn ergibt, bu, ich weiß nicht, was ich hier nicht weiß!) –

1

Mike Atlas' Antwort ist ziemlich umfassend, aber beachten Sie, dass Sie 10g anschließen können (oder höher) DBs, die don ‚t haben eine veröffentlichte tnsname mit [//] Host-Name [: port] [/ service_name]

HTH

C.

2

Ich wollte nur t hinzufügen o dies, da ich kürzlich eine ähnliche Verbindungsproblematik hatte, die mich verrückt machte, bis ich herausfand, was passierte.

Erstens sind die Schlüsselwörter SID und SERVICE_NAME nicht genau gleich. Das war meine erste falsche Annahme. In vielen Umgebungen können Sie SID und SERVICE_NAME austauschen, aber nicht immer, es kommt darauf an.

Das heißt, gibt Ihrem Fehler das Problem weg: Sie SID in einer Verbindungszeichenfolge anstelle des SERVICE_NAME sind spezifiziert, die erfolgreich verwendet TNSNAMES.

Wenn Sie also die Verbindungszeichenfolge in Ihrem Code angeben, versuchen Sie das Schlüsselwort SERVICE_NAME in der Verbindungszeichenfolge (* oder, wenn Sie SERVICE_NAME bereits verwenden und keine Verbindung herstellen können, versuchen Sie das SID-Schlüsselwort *).

Übermäßig vereinfachende Antwort Ich weiß, aber einfach zu versuchen und kann jemand einige Kopfschmerzen sparen.

Hoffe, dass hilft.

+0

+1 nach all diesen Jahren, weil UGH, Oracle. –