Was ist ein TNS: Listener im Kontext von Oracle?

8

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

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

%Vor%

Dies ist der Fehler, den PHP meldet, und der Fehler, der in Oracles listener.log auftaucht.

Mein direktes Problem besteht darin, diesen Fehler zu beheben. Die größere Frage, die ich beantworten möchte, ist, wie Oracle Verbindungsmodell arbeitet?

Dies ist in einer Entwicklungsumgebung, die auf meinem lokalen Windows-Rechner läuft und bis jetzt funktioniert hat. Leider wurde mir die Umgebung übergeben (ich habe sie nicht eingerichtet) und die Leute, die es eingerichtet haben, können mir nicht helfen, es zu debuggen.

Wenn ich einen ähnlichen Fehler mit MySQL oder PostgreSQL erhalte (zwei Systeme, mit denen ich vertraut bin), würde ich sicherstellen, dass ein Datenbankprozess ausgeführt wird, und dann versuchen, eine Verbindung zur Datenbank mit dem Benutzernamen herzustellen / 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 so etwas)

Jeder allgemeine Hinweis wäre willkommen.

Updates pro Kommentar:

In meiner tnsnames.ora-Datei befindet sich eine ganze Menge, der relevante Eintrag ist

%Vor%

Dies wird nicht in der Liste der Instanzen angezeigt, wenn ich

ausführe %Vor%

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

    
Alan Storm 25.01.2010, 18:36
quelle

3 Antworten

7

Ein TNS-Name ist wie ein Alias ​​für Ihre Serviceinstanz. 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, ungültig ist.

Sie können dann testen, ob der TNS-Listener den Dienst mithilfe des Befehlszeilentools korrekt anzeigt:

%Vor%

Was sollte etwa so aussehen:

%Vor%

Können Sie bitte den relevanten TNS-Eintrag (in der tnsnames.ora -Datei) posten? 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 für eine richtige TNS-Namensdefinition in tnsnames.ora namens 'mydb':

%Vor%     
Mike Atlas 25.01.2010, 18:44
quelle
2

Ich wollte nur hinzufügen, da ich kürzlich ein ähnliches Problem mit der Verbindung hatte, das mich verrückt machte, bis ich herausgefunden hatte, was los war.

Erstens sind die Schlüsselwörter SID und SERVICE_NAME nicht genau identisch. 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, Ihr Fehler weist das Problem auf: Sie geben SID in einer Verbindungszeichenfolge anstatt der SERVICE_NAME an, die tnsnames erfolgreich verwendet.

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 simple Antwort, die ich kenne, aber leicht zu versuchen und jemandem Kopfschmerzen ersparen kann.

Ich hoffe, das hilft.

    
tbone 28.12.2012 13:37
quelle
1

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 haben, indem Sie [//] host_name [: port] [/ service_name]

verwenden

HTH

C.

    
symcbean 25.01.2010 18:55
quelle