Database
 sql >> Database >  >> RDS >> Database

Come risolvere ORA-12505, TNS:il listener non conosce attualmente il SID fornito nel descrittore di connessione

Per risolvere correttamente questo errore e connetterci al database Oracle appropriato, dovremo spiegare un po' come si comporta Oracle e, quindi, cosa sta causando questo problema in primo luogo.

SID vs SERVICE_NAMES

È importante comprendere la (leggera) differenza tra ciò che Oracle definisce come SID rispetto a un SERVICE_NAME , poiché utilizzeremo queste informazioni per creare una stringa di connessione adeguata in seguito.

In Oracle, l'identificatore di sistema (o SID ) è un identificatore locale lungo fino a otto caratteri utilizzato per identificare un particolare database e differenziarlo da altri database nel sistema.

Spesso il SID è la parola del prefisso o DB_UNIQUE_NAME che precede il DB_DOMAIN . Ad esempio, il SID della nostra bookstore database, come si vede nel global database name completo di bookstore.company.com .

SERVICE_NAMES , d'altra parte, rappresentano i nomi con cui è possibile connettere le istanze del database. Un SERVICE_NAME in genere seguirà il formato del SID seguito dal dominio del database, in questo modo:DB_UNIQUE_NAME.DB_DOMAIN

L'ascoltatore TNS

Quando un client tenta di connettersi a un database Oracle, anziché connettersi al database direttamente , esiste un servizio broker che interviene e gestisce la richiesta di connessione per il client.

Questa applicazione broker è nota come listener e svolge il compito di ascoltare per le richieste dei clienti in arrivo. Quando viene ricevuta una richiesta, il listener elabora e inoltra la richiesta al server di database Oracle appropriato utilizzando un service handler , che funge semplicemente da collegamento tra il listener e il server del database.

Nomi e configurazione TNS

Quando ci si connette a un database Oracle, in genere il server del database avrà tnsnames.ora , che è un file di configurazione che informa il server su NET_SERVICE_NAMES che sono connessioni database valide. Per impostazione predefinita, questo file si trova in ORACLE_HOME/network/admin .

Ad esempio, un NET_SERVICE_NAME descrittore in tnsnames.ora può essere formattato in questo modo:

myDatabaseNetService =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = tcp)(HOST = localhost)(PORT = 1521)(QUEUESIZE = 100))
    (CONNECT_DATA =
      (SERVICE_NAME = bookstore.company.com)
    )
  )

Questo definirebbe un NET_SERVICE_NAME utilizzando il SERVICE_NAME abbiamo discusso in precedenza (bookstore.company.com ) e connettersi a localhost attraverso la porta 1521 .

Stringa di connessione

Con un po' più di conoscenza su come Oracle si connette effettivamente ai database, ora possiamo vedere come connection strings sono formattati.

Connetti tramite TNS Name/NET_SERVICE_NAME

Quando ci si connette tramite un NET_SERVICE_NAME come specificato nel tuo tnsnames.ora config, devi usare il username , password , quindi aggiungi il NET_SERVICE_NAME con il @ simbolo, in questo modo:

username/password@NET_SERVICE_NAME

Quindi, per il nostro precedente NET_SERVICE_NAME descrittore sopra, l'effettivo NET_SERVICE_NAME abbiamo definito myDatabaseNetService , quindi la nostra stringa di connessione potrebbe assomigliare a questa:

john/Hunter2@myDatabaseNetService

Connetti tramite SERVICE_NAME

Quando ti connetti tramite un SERVICE_NAME , dovrai anche aggiungere l'host e port , insieme a / simbolo che precede il SERVICE_NAME stesso:

username/password@host:port/SERVICE_NAME

Connetti tramite SID

Infine, se ci si connette senza un NET_SERVICE_NAME configurato o anche SERVICE_NAME , puoi farlo direttamente tramite il SID utilizzando il : simbolo al posto del / simbolo come con il SERVICE_NAME stringa di connessione:

username/password@host:port:SID