Domanda

domanda Borderline ServerFault, ma Ho pensato di provare qui prima da quando ho avuto fortuna con le domande di Oracle in passato.

Sto cercando di connettersi a un database Oracle da PHP, e sto ottenendo il seguente errore.

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

Questo è l'errore che PHP rapporti, e l'errore che si presenta in listener.log di Oracle.

Il mio problema immediato è che fissa questo errore. La domanda più grande che vorrei risposto Ecco come funziona il modello connessione Oracle?

Questo è in un ambiente di sviluppo che è in esecuzione sulla mia macchina Windows locali e ha lavorato fino ad ora. Purtroppo, l'ambiente è stato consegnato a me (non ho messo in su) e le persone che ha l'eresse non sono disponibili per aiutarmi a eseguire il debug.

Se mi è stato sempre un errore simile con MySQL o PostgreSQL (due sistemi sono più familiarità con), mi piacerebbe verificare che un processo di database è in esecuzione, e quindi si tenta di collegarsi manualmente al database utilizzando il nome utente / password string / connessione. Purtroppo, non ho familiarità con gli strumenti di Oracle su Windows (diversi da SQL Developer) e io non so che cosa un TNS: ascoltatore o SID sono nel contesto di Oracle (ho idee vaghe, ma le idee vaghe raramente aiuto quando stai debug qualcosa di simile)

Qualche 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 è, come si fa tento di avviare manualmente l'istanza OBS2?

È stato utile?

Soluzione

Un nome TNS è come un alias per l'istanza di servizio. Il servizio listener TNS agisce come una sorta di servizio di ricerca per voi in questo senso. Fallirà con questo messaggio di errore se il servizio effettivo si sta cercando di connettersi a 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))

Si può si prega di inviare la voce TNS rilevante (nel file tnsnames.ora)? Si trova in OraHome \ client o db \ Admin \ NETWORK. Se si dispone di client e server, assicurarsi che entrambe le copie del file tnsnames.ora hanno valori corretti, giusto per essere sicuri.

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

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

Altri suggerimenti

Volevo solo aggiungere a questo, come di recente ho avuto un problema di connessione simile che mi ha spinto i dadi fino a quando ho capito cosa stava succedendo.

In primo luogo, la parole chiave SID e SERVICE_NAME non sono esattamente la stessa cosa. Questo era il mio primo presupposto sbagliato. In molti ambienti si può 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 SERVICE_NAME parola chiave nella stringa di connessione (* o, se hai già utilizzando SERVICE_NAME e non è possibile connettersi, provare a utilizzare SID parola chiave *).

risposta troppo semplicistico lo so, ma facile da provare e può salvare qualcuno qualche mal di testa.

La speranza che aiuta.

risposta

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

HTH

C.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top