ORA-12514 TNS: l'ascoltatore attualmente non è a conoscenza del servizio richiesto nel descrittore di connessione


226

Abbiamo un'applicazione in esecuzione localmente in cui si verifica il seguente errore:

ORA-12514: TNS: il listener non è al momento a conoscenza del servizio richiesto nel descrittore di connessione

Ho testato la connessione usando TNSPingquale risolto correttamente e ho provato SQLPlusa provare la connessione, che non è riuscita con lo stesso errore di cui sopra. Ho usato questa sintassi per SQLPlus:

sqlplus username/password@addressname[or host name]

Abbiamo verificato che:

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

Non siamo a conoscenza di eventuali modifiche apportate a questo ambiente. Nient'altro che possiamo testare?


2
qual è il comando TNSPing (con parametri) che hai usato?
Grzegorz,

quando dici "in esecuzione localmente" intendi che l'applicazione si sta connettendo a un database sullo stesso host? Inoltre, quali sono i contenuti del tuo file sqlnet.ora? quali versioni sono riportate per sqlplus e tnsping e sei sicuro che siano nello stesso ORACLE_HOME?
David Aldridge,

1
prova a riavviare il database. Dal momento che avrebbero dovuto informare il Listener della loro esistenza all'avvio, questo potrebbe risolvere il tuo problema.
Jens Schauder,

1
ALTER SYSTEM REGISTER è meno drastico del riavvio del database.
DCookie

Risposte:


209

Ho avuto questo problema e la correzione è stata per assicurarsi che in tnsnames.orail SERVICE_NAMEè un nome di servizio valido nel database. Per trovare nomi di servizi validi, è possibile utilizzare la seguente query in Oracle:

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

Una volta aggiornato tnsnames.oraa:

TEST =
   (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = *<validhost>*)(PORT = *<validport>*))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = *<servicenamefromDB>*)
    )
)

poi ho corso:

sqlplus user@TEST

Successo! L'ascoltatore ti sta sostanzialmente dicendo che qualunque sia il nome_servizio che stai usando non è un servizio valido secondo il DB.

(* Stavo eseguendo sqlplus dalla workstation client Win7 al DB remoto e incolpavo i DBA;) *)


2
Su win7,% ORACLE_HOME% \ NETWORK \ ADMIN \ tnsnames.ora
Brad Rippe

198
Come posso interrogare il DB se non riesco nemmeno a collegarmi ad esso ??
isabelle martz,

2
Puoi ssh direttamente sul server DB ed eseguire sqlplus da lì?
Brad Rippe,

1
questo potrebbe non essere il caso in cui più client / server sono o erano installati sulla stessa macchina. (tnsping restituisce la posizione della directory che utilizza) - nel mio caso, listener.ora in quella directory conteneva informazioni relative a una vecchia istanza di database che avevo disinstallato - il modo rapido e sporco era di copiare l'intero contenuto di listener.ora da la mia attuale installazione di Oracle Express, in quell'altra directory che l'ascoltatore sembra controllare (penso di averlo cambiato attraverso un registro o qualcosa del genere, e ha la precedenza su ORACLE_HOME (?))
hello_earth

8
ORA-00942: la tabella o la vista non esiste
Tommy Holman,

44

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 guardato direttamente, indica che il listener non riconosce il nome del servizio. Ma dove conservano i nomi dei servizi? Nel%ORACLE_HOME%\NETWORK\ADMIN\listener.ora

"SID_LIST" è proprio questo, un elenco di SID e nomi di servizi abbinati in un formato che è possibile 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. Adesso va tutto bene.


Ad esempio, il file listener.ora inizialmente potrebbe apparire come:

# listener.ora Network Configuration File: C:\app\oracle_user\product\12.1.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\app\oracle_user\product\12.1.0\dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:C:\app\oracle_user\product\12.1.0\dbhome_1\bin\oraclr12.dll")
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

... E per riconoscerlo come nome di un servizio orcl, è possibile modificarlo in:

# listener.ora Network Configuration File: C:\app\oracle_user\product\12.1.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\app\oracle_user\product\12.1.0\dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:C:\app\oracle_user\product\12.1.0\dbhome_1\bin\oraclr12.dll")
    )
    (SID_DESC = 
        (GLOBAL_DBNAME = orcl)
        (ORACLE_HOME = C:\app\oracle_user\product\12.1.0\dbhome_1)
        (SID_NAME = orcl)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

3
È necessario aggiornare questa risposta con la sintassi di come listener.oramemorizza i nomi. Non ho nemmeno un listener.orafile. Sono anche su una workstation client che esegue SQL Developer e sto cercando di creare un collegamento al database quando ricevo l'errore. Non ho un servizio Oracle Listener da riavviare.
vapcguy,

vapcguy, devi essere sul server di database. sembra che tu sia sul cliente
Joseph Argenio,

Dopo aver seguito le istruzioni di Sepideh riguardanti Net Manager, ho notato che il mio file hearers.ora era stato aggiornato per contenere una nuova voce SID_LIST. Ho modificato questa risposta per includere un esempio prima e dopo della sintassi, a beneficio dei lettori che non possono utilizzare Net Manager, per qualsiasi motivo.
Kevin,

12

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

vai su Net Manager> Listener> seleziona i servizi di database dalla casella> "Nome database globale" deve essere uguale a "SID" e "Directory principale Oracle" deve essere corretta.

Se non si dispone di alcuna voce per i servizi di database, crearne uno e impostare il database globale corretto side l'oracolo home.


12

Nelle mie circostanze, l'errore era dovuto al fatto che l'ascoltatore non aveva registrato il servizio del 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 alla registrazione listener.oramanuale del servizio :

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

Infine, riavvia il listener con il comando:

> lsnrctl stop
> lsnrctl start

Fatto!


8

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


In Windows, se si utilizza Oracle Release 12.x, assicurarsi che il servizio OracleServiceORCL sia in esecuzione. Se questo servizio non viene avviato, riceverai anche lo stesso codice di errore.
Falco di strada,

5

Questo dovrebbe davvero essere un commento alla risposta di Brad Rippe , ma purtroppo, non abbastanza rappresentante. Quella risposta mi ha permesso di ottenere il 90% del viaggio lì. Nel mio caso, l'installazione e la configurazione dei database inseriscono le voci nel file tnsnames.ora per i database che stavo eseguendo. 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 utilizzando

sqlplus / as sysdba

Quindi, eseguendo il comando dalla risposta di Brad Rippe:

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

ha mostrato che i nomi non corrispondevano esattamente. Le voci create utilizzando Oracle Database Assistant 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 semplicemente mydatabaseanziché mydatabase.mydomain.com. Ho modificato il file tnsnames.ora solo sul nome di base senza la parte del dominio, quindi sembravano così:

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 stope lsnrctl startda una finestra di comando dell'amministratore [o Windows Powershell] invece del pannello di controllo dei Servizi, ma entrambi funzionano). Successivamente, sono stato in grado di connettermi.


4

Ho avuto lo stesso problema. Per me, sto solo scrivendo

sqlplus myusername/mypassword@localhost

fatto il trucco, farlo lo rende connettersi al nome del servizio predefinito, immagino.


1
Abbiamo riscontrato un problema simile con la nostra stringa di connessione che causa questo errore. Siamo stati Collegamento mediante il driver JDBC sottile di Oracle con la stringa di connessione: jdbc:oracle:thin:@//localhost:1521/orcl. La stringa di connessione corretta per eliminare questo errore era: jdbc:oracle:thin:@localhost:1521.
dan

dipende se funzionerebbe - penso che questo modo di connettersi, a giudicare da ciò che hanno detto gli altri, stia scavalcando completamente l'ascoltatore, usando il nome host del computer invece del SID - questo modo di connettersi causa problemi nei client di terze parti, - penso funziona anche solo quando EZCONNECT è specificato in sqlnet.ora: NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)
hello_earth

3

quello che ha funzionato per me è stato davvero semplice, avevo solo bisogno di avviare il servizio manualmente nei "Servizi Windows" (services.msc in cmd trompt). il mio nome del servizio è: OracleServiceXXXXX.


Nel mio caso, sebbene Startup Type sia impostato su Automatic, non si avvia all'avvio della macchina. Dopo aver avviato manualmente il servizio "OracleServiceXE", funziona per Oracle Database 11g Express per connettersi alla pagina Web DB e APEX (Oracle Application Express).
Ivan Chau,

2

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


Questo era esattamente il mio problema. Il nostro database è ospitato su una VM che era inattivo mentre stavo tentando di utilizzare un altro programma che utilizzava DP. Dopo aver visto questo thread mi sono reso conto che probabilmente era inattivo.
Sh4d0wsPlyr

2

Questo errore può verificarsi quando un'applicazione crea una nuova connessione per ogni interazione del database o le connessioni non vengono chiuse correttamente. Uno degli strumenti gratuiti per monitorare e confermare questo è lo sviluppatore Oracle Sql (anche se questo non è l'unico strumento che è possibile utilizzare per monitorare le sessioni DB).

puoi scaricare lo strumento dal sito Oracle orlatore Developer

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

inserisci qui la descrizione dell'immagine


2

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 incorporato:

$sudo gedit /etc/hosts

Ciao.


2
questo è vecchio, ma non ha molto senso aggiungere il tuo IP a / etc / hosts. A OP manca SERVICE_NAME, altre cose sono abbastanza indipendenti
Ostap,

Non ho aggiunto il mio IP a / etc / host. L'ho appena corretto. Come puoi vedere in questo argomento, ci sono molte risposte e varietà valide (con voti positivi) per risolvere questa domanda. Se quella risposta non ti ha aiutato, perché votare? Questa risposta può ancora aiutare qualcuno come mi ha aiutato.
Sergio MC Figueiredo,

2

Per quelli che potrebbero eseguire Oracle in una VM (come me) ho riscontrato questo problema perché la mia VM stava esaurendo la memoria, il che sembra aver impedito a OracleDB di avviarsi / funzionare correttamente. L'aumento della memoria della VM e il riavvio hanno risolto il problema.


2

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

Per me l'errore 12514 è stato risolto dopo aver specificato SERVICE_NAME corretto. Lo trovi sul server nel file tnsnames.orache viene fornito con 3 nomi di servizi predefiniti (uno di questi è "XE").

  1. Ho installato il database Oracle Express OracleXE112 che già include 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 esplicitamente l'accesso per il 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 essere nella stessa directory del file EXE o è 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 aHKLM\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 di dimensioni superiori a 100 MB, è necessario scaricare ODP.NET_Managed12.xxxxxxxx.zip in Oracle.ManagedDataAccess.dllcui è disponibile solo 4 MB ed è una DLL gestita pura che funziona con processi a 32 e 64 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;";

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

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

Se l' SERVICE_NAME=XEerrore è errato, viene visualizzato l'errore 12514. SERVICE_NAMEÈ facoltativo. Puoi anche lasciarlo via.


Grazie mille, dalla tua soluzione ho trovato il trucco, nel mio caso, era l'antivirus che stava bloccando il programma, quindi non era in grado di ottenere una connessione al db Oracle.
robot_alien,

2

Avevo anche affrontato lo stesso problema e ho trascorso 3 giorni per scavarlo.

Ciò accade a causa della voce errata del servizio TNS.

Verificare innanzitutto se si è in grado di connettersi al database di standby dal database primario utilizzando sql> sqlplus sys@orastand as sysdba( orastandè un database di standby).

Se non riesci a connetterti, allora è un problema con il servizio. Correggere la voce del nome del servizio nel file TNS all'estremità primaria.

Controllare il database di standby allo stesso modo. Apporta le modifiche anche qui, se necessario.

Assicurarsi che il log_archive_dest_2parametro abbia il nome del servizio corretto.


1

Ho avuto lo stesso errore perché il SID remoto specificato era errato:

 > sqlplus $DATASOURCE_USERNAME/$DATASOURCE_PASSWORD@$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 alcun problema.


0

Nel mio caso il database aveva esaurito lo spazio su disco. Ciò ha causato la sua mancata risposta. Una volta chiarito il problema, tutto ha funzionato di nuovo.


Come posso scoprirlo?
CodeSlave

0

Per me questo è stato causato dall'utilizzo di un ipadress dinamico durante l'installazione. Ho reinstallato Oracle usando un indirizzo IP statico e poi tutto è andato bene



0

Il mio problema è stato risolto sostituendo'SID "nell'URL con" nome servizio "e host corretto.


0

tnslsnr è attivo ma il database è inattivo.

Per i principianti di Oracle non è ovvio che il database potrebbe essere inattivo mentre le connessioni sono accettate.

Ho dovuto avviare il database manualmente in quel modo

su - oracle
export ORACLE_SID=XE
sqlplus sys as sysdba

E poi nella console sql

startup

Nel mio caso non sono riuscito ad avviarlo ma ho ricevuto un altro messaggio di errore e ho trovato l'origine di un problema: ho dovuto cambiare il nome host e quindi l'avvio automatico del database ha funzionato di nuovo.


0

Ho implementato di seguito la soluzione alternativa per risolvere questo problema.

  1. Ho impostato ORACLE_HOME utilizzando il prompt dei comandi (fare clic con il pulsante destro del mouse su cmd.exe ed Esegui come amministratore di sistema).

  2. Usato sotto il comando

    set oracle_home="path to the oracle home"

  3. Vai a Tutti i programmi -> Oracle -ora home1 -> Strumenti di migrazione della configurazione -> Net Manager -> Listener

  4. Selezionare Servizi database dal menu a discesa. Sia il nome del database globale che il SID sono impostati sullo stesso (ORCL nel mio caso). Imposta Oracle Home Directory.

Esempio di finestra di Oracle Net Manager dalla documentazione di Oracle: Esempio di Oracle Net Manager

  1. Fare clic su File e salvare la configurazione di rete.

0

Il problema era che l'URL della mia stringa di connessione conteneva il nome del database anziché il SID. La sostituzione del nome del database con la connessione al database Oracle ha risolto questo problema.

Per conoscere il tuo SID di Oracle puoi sfogliare il tnsnames.orafile.

XE era il SID effettivo, quindi ecco come appare ora la mia stringa di connessione Tomcat:

    <Resource
       name="jdbc/my_db_conn"
       auth="Container"
       type="javax.sql.DataSource"
       driverClassName="oracle.jdbc.driver.OracleDriver"
       url="jdbc:oracle:thin:@//127.0.0.1:1521/XE"
       username="test_user"
       password="test" />

La mia versione del server era "Oracle 11.2 Express", ma la soluzione dovrebbe funzionare anche su altre versioni.


0

Nel mio caso, nel file tnsnames.ora mancavano parentesi tonde intorno a SERVICE_NAME .

<DBNAME> =
  (DESCRIPTION =
    (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL=TCP)(HOST = nupark-cnvr-ora )(PORT=1521))
    )
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = <DBNAME> ***CLOSING ROUND BRACKET WAS MISSING HERE***
    )
  )

LISTENER_<DBNAME> =

  (ADDRESS = (PROTOCOL = TCP)(HOST = nupark-cnvr-ora)(PORT = 1521))

0

Per coloro che utilizzano Spring-Boot e jdbc per la connessione. Devi stare attento mentre scrivi jdbcUrl in application.properties

Con SID nella connessione al database - source.datasource.jdbcUrl = jdbc:oracle:thin:@[HOST][:PORT]:SID

Con il nome del servizio nella connessione db globe.datasource.jdbcUrl = jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE

Questo ha funzionato per me :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.