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




9 Answers

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, è possibile 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 = *<validhost>*)(PORT = *<validport>*))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = *<servicenamefromDB>*)
    )
)

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

download windows

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 sintassi 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 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.




Questo in realtà dovrebbe essere un commento alla risposta di , 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.




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 è possibile 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).




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.




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.




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.




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) è possibile 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):
using Oracle.DataAccess.Client;
or
using Oracle.ManagedDataAccess.Client;

....

string oradb = "Data Source=(DESCRIPTION="
    + "(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.158)(PORT=1521)))"
    + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=XE)));"
    + "User Id=SYSTEM;Password=xxx;";

using (OracleConnection conn = new OracleConnection(oradb)) 
{
    conn.Open();
    using (OracleCommand cmd = new OracleCommand())
    {
        cmd.Connection  = conn;
        cmd.CommandText = "select TABLESPACE_NAME from DBA_DATA_FILES";

        using (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.




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




Related