ORA-12514 TNS: il listener non conosce al momento il servizio richiesto nel descrittore di connessione

Abbiamo un’applicazione in esecuzione localmente in cui stiamo riscontrando il seguente errore:

ORA-12514: TNS: il listener non conosce al momento il servizio richiesto nel descrittore di connessione

Ho provato la connessione usando TNSPing che è stata risolta correttamente e ho provato SQLPlus a provare la connessione, che ha avuto esito negativo con lo stesso errore di cui sopra. Ho usato questa syntax per SQLPlus :

 sqlplus username/[email protected][or host name] 

Abbiamo verificato che:

  • il listener TNS sul server è in esecuzione.
  • L’Oracle stesso sul server è in esecuzione.

Non sappiamo di eventuali modifiche apportate a questo ambiente. Qualcos’altro che possiamo testare?

Ho riscontrato questo problema e la correzione era per assicurarmi che in tnsnames.ora il SERVICE_NAME fosse un nome di servizio valido nel tuo database. Per scoprire nomi di servizio validi, è ansible utilizzare la seguente query in oracle:

 select value from v$parameter where name='service_names' 

Una volta aggiornato tnsnames.ora su:

 TEST = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = **)(PORT = **)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = **) ) ) 

poi ho corso:

 sqlplus [email protected] 

Successo! L’ascoltatore ti sta fondamentalmente dicendo che qualunque sia il nome_servizio che stai usando non è un servizio valido in base al DB.

(* Stavo eseguendo sqlplus dalla workstation client Win7 al DB remoto e incolpavo gli amministratori di database;) *)

So che questa è una vecchia domanda, ma ancora senza risposta. Mi ci è voluto un giorno di ricerche, ma ho trovato la soluzione più semplice, almeno nel mio caso (Oracle 11.2 su Windows 2008 R2) e volevo condividere.

L’errore, se esaminato direttamente, indica che il listener non riconosce il nome del servizio. Ma dove tiene i nomi dei servizi? In %ORACLE_HOME%\NETWORK\ADMIN\listener.ora

Il “SID_LIST” è proprio questo, un elenco di SID e nomi di servizio abbinati in un formato che è ansible copiare o cercare.

Ho aggiunto il problema Nome servizio, quindi nel pannello di controllo “Servizi” di Windows, ho eseguito un “riavvio” sul servizio listener Oracle. Ora va tutto bene.

Ho avuto questo problema su Windows Server 2008 R2 e Oracle 11g

andare su Net Manager> Listener> selezionare i servizi del database dalla combox> “Nome del database globale” deve essere uguale a “SID” e “Oracle Home Directory” deve essere corretto.

Se non si dispone di alcuna voce per i servizi di database, crearne uno e impostare il database globale corretto, sid e oracle home.

Avvio di OracleServiceXXX da services.msc ha funzionato per me in Windows.

Nelle mie circostanze l’errore era dovuto al fatto che l’ascoltatore non aveva registrato il servizio di db. Ho risolto questo registrando i servizi. Esempio:

Il mio descrittore in tnsnames.ora :

 LOCALDB = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = LOCALDB) ) ) 

Quindi, procedo a registrare manualmente il servizio nel listener.ora :

 SID_LIST_LISTENER = (SID_DESC = (GLOBAL_DBNAME = LOCALDB) (ORACLE_HOME = C:\Oracle\product\11.2.0\dbhome_1) (SID_NAME = LOCALDB) ) ) 

Infine, riavvia l’ascoltatore con il comando:

 > lsnrctl stop > lsnrctl start 

Fatto!

Questo in realtà dovrebbe essere un commento alla risposta di Brad Rippe , ma ahimè, non abbastanza rep. Quella risposta mi ha preso il 90% del modo in cui ci sono. Nel mio caso, l’installazione e la configurazione dei database inserivano le voci nel file tnsnames.ora per i database che stavo correndo. Innanzitutto, sono stato in grado di connettermi al database impostando le variabili di ambiente (Windows):

 set ORACLE_SID=mydatabase set ORACLE_HOME=C:\Oracle\product\11.2.0\dbhome_1 

e quindi connettersi usando

 sqlplus / as sysdba 

Quindi, eseguendo il comando dalla risposta di Brad Rippe:

 select value from v$parameter where name='service_names'; 

ha dimostrato che i nomi non corrispondevano esattamente. Le voci create utilizzando Oracle Database Configuration Assistant dove originariamente:

 MYDATABASE = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = mylaptop.mydomain.com)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = mydatabase.mydomain.com) ) ) 

Il nome del servizio dalla query era solo mydatabase anziché mydatabase.mydomain.com . Ho modificato il file tnsnames.ora con il solo nome base senza la parte del dominio in modo che assomigliasse a questo:

 MYDATABASE = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = mylaptop.mydomain.com)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = mydatabase) ) ) 

Ho riavviato il servizio Listener TNS (utilizzo spesso lsnrctl stop e lsnrctl start da una finestra di comando dell’amministratore [o Windows Powershell] anziché dal pannello di controllo Servizi, ma entrambi funzionano.) Successivamente, sono riuscito a connettermi.

Verifica se il database è attivo. Accedere al server, impostare la variabile di ambiente ORACLE_SID sul SID del database ed eseguire SQL * Plus come connessione locale.

Questo errore può verificarsi quando un’applicazione crea una nuova connessione per ogni interazione con il database o le connessioni non vengono chiuse correttamente. Uno degli strumenti gratuiti per monitorare e confermare questo è lo sviluppatore di Oracle Sql (sebbene questo non sia l’unico strumento che è ansible utilizzare per monitorare le sessioni DB).

puoi scaricare lo strumento dal sito di Oracle Sql Developer

ecco uno screenshot di come monitorare le sessioni. (Se vedi molte sessioni accumularsi per l’utente dell’applicazione durante la visualizzazione dell’errore ORA-12514, allora è una buona indicazione che potresti avere un problema con il pool di connessioni).

inserisci la descrizione dell'immagine qui

Ho anche affrontato lo stesso problema e ho trascorso 3 giorni a scavare. Ciò accade a causa dell’errata immissione del servizio TNS. Per prima cosa controlla se sei in grado di connettersi al database di standby dal database principale usando sql> sqlplus sys @ orastand come sysdba (orastand è il database di standby), se non sei in grado di connetterti allora è un problema con il servizio. Correggere la voce del nome del servizio nel file TNS alla fine principale. Controlla allo stesso modo nel database di standby, se è necessario apportare le modifiche anche qui. e Assicurarsi che il parmater log_archive_dest_2 abbia il nome di servizio corretto.

Ho avuto lo stesso problema, per me semplicemente scrivendo

 sqlplus myusername/[email protected] 

ha fatto il trucco, facendo così si connette al nome del servizio predefinito credo.

Per coloro che potrebbero eseguire Oracle in una VM (come me), ho visto questo problema perché la mia VM era a corto di memoria, il che sembra aver impedito l’avvio / il corretto funzionamento di OracleDB. L’aumento della memoria della mia macchina virtuale e il riavvio hanno risolto il problema.

Nel mio caso il database aveva esaurito lo spazio su disco. Che ha causato a non rispondere. Una volta risolto il problema, tutto ha funzionato di nuovo.

Ho risolto questo problema nel mio ambiente Linux aggiornando l’IP della mia macchina nel file / etc / hosts.

Puoi verificare il tuo IP di rete (inet end) con:

 $ifconfig 

Verifica se il tuo IP corrisponde al file / etc / hosts:

 $cat /etc/hosts 

Modifica il tuo file / etc / hosts, se presente:

 $sudo gedit /etc/hosts 

Ciao.

ciò che ha funzionato per me è stato molto semplice, avevo solo bisogno di avviare manualmente il servizio nei “Servizi Windows” (services.msc in cmd trompt). il mio nome di servizio è: OracleServiceXXXXX.

Molte risposte qui, ma ecco un esempio funzionante con codice che puoi copiare e incollare e testare immediatamente:

Per me l’errore 12514 è stato risolto dopo aver specificato il SERVICE_NAME corretto. Lo trovi sul server nel file tnsnames.ora che viene fornito con 3 nomi di servizio predefiniti (uno di loro è “XE”).

  1. Ho installato il database Oracle Express OracleXE112 che già viene fornito con alcune tabelle demo preinstallate.
  2. Quando si avvia il programma di installazione viene richiesta una password. Ho inserito “xxx” come password. (non utilizzato in produzione)
  3. Il mio server funziona sulla macchina 192.168.1.158
  4. Sul server è necessario consentire in modo esplicito l’accesso al processo TNSLSNR.exe in Windows Firewall. Questo processo è in ascolto sulla porta 1521.
  5. OPZIONE A: Per C # (.NET2 o .NET4) è ansible scaricare ODAC11 , da cui è necessario aggiungere Oracle.DataAccess.dll al progetto. Inoltre questa DLL dipende da: OraOps11w.dll, oci.dll, oraociei11.dll (130 MB!), Msvcr80.dll. Queste DLL devono trovarsi nella stessa directory dell’EXE oppure è necessario specificare il percorso DLL in: HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath . Su macchine a 64 bit scrivere in aggiunta a HKLM\SOFTWARE\Wow6432Node\Oracle\...
  6. OPZIONE B: Se hai scaricato ODAC12 hai bisogno di Oracle.DataAccess.dll, OraOps12w.dll, oci.dll, oraociei12.dll (160 MB!), Oraons.dll, msvcr100.dll. Il percorso del registro è HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
  7. OPZIONE C: Se non si desidera una DLL enorme di oltre 100 MB, è necessario scaricare ODP.NET_Managed12.xxxxxxxx.zip in cui si trova Oracle.ManagedDataAccess.dll che è solo 4 MB ed è una DLL gestita in modo semplice che funziona in 32 anche i processi a 64 bit e bit e non dipende da altre DLL e non richiede alcuna voce di registro.
  8. Il seguente codice C # funziona per me senza alcuna configurazione sul lato server (solo l’installazione predefinita):
 utilizzando Oracle.DataAccess.Client;
 o
 utilizzando Oracle.ManagedDataAccess.Client;

 ....

 string oradb = "Origine dati = (DESCRIPTION ="
     + "(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP) (HOST = 192.168.1.158) (PORT = 1521)))"
     + "(CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE)));"
     + "ID utente = SISTEMA; Password = xxx;";

 utilizzando (connessione OracleConnection = new OracleConnection (oradb)) 
 {
     conn.Open ();
     utilizzando (OracleCommand cmd = new OracleCommand ())
     {
         cmd.Connection = conn;
         cmd.CommandText = "seleziona TABLESPACE_NAME da DBA_DATA_FILES";

         utilizzando (OracleDataReader dr = cmd.ExecuteReader ())
         {
             while (dr.Read ())
             {
                 listBox.Items.Add (dr [ "TABLESPACE_NAME"]);
             }
         }
     }
 } 

Se SERVICE_NAME=XE è errato ricevi l’errore 12514. SERVICE_NAME è facoltativo. Puoi anche lasciarlo andare via.

Ho ricevuto lo stesso errore perché il SID remoto specificato era sbagliato:

  > sqlplus $DATASOURCE_USERNAME/[email protected]$DB_SERVER_URL/$REMOTE_SID 

Ho interrogato il database di sistema:

seleziona * da global_name;

e ho trovato il mio SID remoto (“XE”).

Quindi potrei connettermi senza problemi.

Per me questo è stato causato dall’uso di un ipadress dinamico usando l’installazione. Ho reinstallato Oracle utilizzando un indirizzo IP statico e quindi tutto andava bene

Ho finito di lavorare per risolvere questo problema.

  1. Ho impostato oracle_home nel prompt di cmd (fare clic con il pulsante destro del mouse su cmd.exe Esegui come amministratore di sistema). usato sotto il comando

    imposta oracle_home = “percorso alla casa dell’oracle”

ho installato Oracle nella mia D: unità.

  1. E Vai a Tutti i programmi -> Oracle -ora home1 -> Strumenti di migrazione della configurazione Net Manager -> Listener -> seleziona Database Services dal menu a discesa -> Nome del database globale e SID entrambi sono impostati sullo stesso nel mio caso è ORCL, imposta la directory oracle_home. Fare clic su File e salvare la configurazione di rete.