2010-01-25 23 views
8

Domanda ServerFault borderline, ma ho pensato di provare prima qui da quando ho avuto fortuna con le domande Oracle in passato.Che cos'è un TNS: ascoltatore nel contesto di Oracle?

Sto provando a connettermi a un database Oracle da PHP e ho ricevuto il seguente errore.

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

Questo è l'errore segnalato da PHP e l'errore visualizzato nel listener.log di Oracle.

Il mio problema immediato è la risoluzione di questo errore. La domanda più ampia a cui vorrei rispondere è come funziona il modello di connessione Oracle?

Questo è in un ambiente di sviluppo in esecuzione sul mio computer Windows locale e ha funzionato fino ad ora. Sfortunatamente, l'ambiente mi è stato consegnato (non l'ho configurato) e le persone che hanno effettuato il non sono disponibili per aiutarmi a eseguirne il debug.

Se dovessi ottenere un errore simile con MySQL o PostgreSQL (due sistemi con cui ho più familiarità), controllerei che fosse in esecuzione un processo di database e quindi tentassi di connetterti manualmente al database utilizzando il nome utente/password/stringa di connessione. Sfortunatamente, non ho familiarità con gli strumenti Oracle su Windows (diversi da SQL Developer) e non so cosa sia un TNS: ascoltatore o SID nel contesto di Oracle (ho idee vaghe, ma idee vaghe raramente aiutano quando stai eseguendo il debug di qualcosa del genere)

Qualsiasi consiglio generale sarebbe apprezzato.

Aggiornamenti per Commenti:

C'è un certo numero di interi nel mio file tnsnames.ora, la voce corrispondente essendo

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

Questo non si riflette nella lista dei casi in cui corro

LSNRCTL> services 

Quindi penso che la mia prossima domanda sia, come posso provare ad avviare manualmente l'istanza OBS2?

+1

Una voce TNS fa parte della stringa di connessione a Oracle. –

risposta

7

Un nome TNS è come un alias per l'istanza di servizio. Il servizio di ascolto di TNS agisce come una sorta di servizio di ricerca per te in questo senso. Fallirà con quel messaggio di errore se il servizio effettivo a cui stai tentando di connettersi tramite un nome TNS non è valido.

È quindi possibile testare per vedere se l'ascoltatore TNS vede il servizio correttamente utilizzando lo strumento da riga di comando:

%>lsnrctl services 

che dovrebbe uscita qualcosa di simile al seguente:

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)) 

potete per favore inserire la voce TNS pertinente (nel file tnsnames.ora)? Si trova in ORAHOME \ client o db \ ADMIN \ NETWORK. Se hai sia client che server, assicurati che entrambe le copie del file tnsnames.ora abbiano valori corretti, solo per sicurezza.

Ecco un esempio di una corretta definizione nome TNS in tnsnames.ora chiamato 'mydb': risposta

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

Domanda aggiornata con informazioni pertinenti. Sembra che la voce TNS relativa non si rifletta nell'ascoltatore. C'è un modo per avviare manualmente un'istanza di TNS? Possibile anche pertinente; Se utilizzo dbca e provo a "Opzioni database Confgiure" per il database/schema (termine destro?) In questione, viene visualizzato il seguente errore: ORA-02778: il nome fornito per la directory del registro non è valido. Ho risolto il mio problema creando un nuovo database e importando un dump recente, ma sarei comunque interessato a qualsiasi tecnica di debug per questo tipo di cose. –

+0

Hai detto che sei su Windows, quindi dovresti essere in grado di vedere se il servizio è in esecuzione nel componente snap-in dei servizi di Windows. Start-> Strumenti di amministrazione-> Servizi. Cerca di vedere se OracleServiceOBS2 (sto indovinando quel nome, potrebbe essere diverso). Quindi avvialo da lì. Anche il servizio di ascolto di TNS è proprio lì, chiamato qualcosa come OracleOraDb10g_home_1TNSListener. –

+1

Quindi, penso che ciò che mi confonde qui è come può un database Oracle essere attivo, ma un altro non può. Cioè, quando ho elencato i servizi che ho visto gli altri database (OBS3, OBS4 ecc.) Erano attivi. Tutti i database sono controllati da OracleServiceOBS2 o ogni database riceve il proprio OracleServiceOBS2? (scusa se questo non ha senso, bu non so cosa non so qui!) –

1

Mike Atlas' è abbastanza completo, ma si noti che è possibile connettersi a 10g (o successiva) DB che don 't hanno una TNSNAME pubblicato utilizzando [//] nome_host [: porta] [/ service_name]

HTH

C.

2

volevo solo aggiungere t o questo, come ho avuto recentemente un problema di connessione simile che mi ha fatto impazzire finché non ho capito cosa stava succedendo.

In primo luogo, le parole chiave SID e SERVICE_NAME non sono esattamente le stesse. Questa è stata la mia prima ipotesi sbagliata. In molti ambienti è possibile scambiare SID e SERVICE_NAME, ma non sempre, dipende.

Detto questo, il vostro errore commette il problema: si sta specificando SID in una stringa di connessione al posto del SERVICE_NAME che tnsnames successo utilizza.

Quindi, se si specifica la stringa di connessione nel codice, provare a utilizzare la parola chiave SERVICE_NAME nella stringa di connessione (* o, se si sta già utilizzando SERVICE_NAME e non è possibile connettersi, provare a utilizzare la parola chiave SID *).

Risposta eccessivamente semplicistica Lo so, ma facile da provare e potrebbe salvare qualcuno dei mal di testa.

Spero che questo aiuti.

+0

+1 dopo tutti questi anni perché UGH, Oracle. –

Problemi correlati