Il listener Oracle 11g ha esito negativo con errori ORA-12514 e ORA-12505


17

Eseguo localmente un'istanza di Oracle 11g sulla mia macchina di sviluppo e posso collegarmi direttamente all'istanza locale tramite SqlPlus:

c:\>sqlplus ace

SQL*Plus: Release 11.2.0.2.0 Production on Mon Mar 11 11:50:20 2013

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

Enter password:

Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - Beta

SQL> select count(*) from my_table ;

  COUNT(*)
----------
      5297

Ma non riesco a collegarmi tramite l'ascoltatore:

c:\>sqlplus -L "user/pw@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE)))"

SQL*Plus: Release 11.2.0.2.0 Production on Mon Mar 11 11:52:40 2013

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

ERROR:
ORA-12514: TNS:listener does not currently know of service requested in connect
descriptor


SP2-0751: Unable to connect to Oracle.  Exiting SQL*Plus

Allo stesso modo, se mi connetto tramite SqlDeveloper ricevo un errore (anche se ORA-12505, TNS:listener does not currently know of SID given in connect descriptor).

Questa istanza è stata stabile e funzionava bene per un anno o più fino ad oggi, un lunedì mattina. Il nostro IT aziendale a volte invia nuove politiche e aggiornamenti durante il fine settimana, quindi presumo che qualcosa sia cambiato, ma non sono stato in grado di capire cosa.

Ho riavviato il servizio e l'ascoltatore più volte, il registro dell'ascoltatore non fornisce alcun indizio.

L'ascoltatore sembra a posto:

c:\>lsnrctl status

LSNRCTL for 32-bit Windows: Version 11.2.0.2.0 - Beta on 11-MAR-2013 11:55:33

Copyright (c) 1991, 2010, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for 32-bit Windows: Version 11.2.0.2.0 - Beta
Start Date                11-MAR-2013 11:17:30
Uptime                    0 days 0 hr. 38 min. 3 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Default Service           XE
Listener Parameter File   C:\oraclexe\app\oracle\product\11.2.0\server\network\admin\listener.ora
Listener Log File         C:\oraclexe\app\oracle\diag\tnslsnr\FBC305BB46560\listener\alert\log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1ipc)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=machine.domain.com)(PORT=1521)))
Services Summary...
Service "CLRExtProc" has 1 instance(s).
  Instance "CLRExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "PLSExtProc" has 1 instance(s).
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully

La porta 1521 sembra ok:

c:\>netstat -an -O | find /i "1521"
  TCP    0.0.0.0:1521           0.0.0.0:0              LISTENING       4368
  TCP    169.243.90.109:55307   159.185.207.100:1521   ESTABLISHED     12416
  TCP    [::]:1521              [::]:0                 LISTENING       4368

(PID 4368 è il processo TNSLSNR.exe.)

Inoltre, posso tnspingal servizio XE:

c:\>tnsping xe

TNS Ping Utility for 32-bit Windows: Version 11.2.0.2.0 - Beta on 11-MAR-2013 12:27:47

Copyright (c) 1997, 2010, Oracle.  All rights reserved.

Used parameter files:
C:\oraclexe\app\oracle\product\11.2.0\server\network\admin\sqlnet.ora


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = machine.domain.com)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE)))
OK (210 msec)

Il listenerr.orafile:

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = C:\oraclexe\app\oracle\product\11.2.0\server)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\oraclexe\app\oracle\product\11.2.0\server)
      (PROGRAM = extproc)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
      (ADDRESS = (PROTOCOL = TCP)(HOST = machine.domain.com)(PORT = 1521))
    )
  )

DEFAULT_SERVICE_LISTENER = (XE)

Inoltre, e non ho idea se sia correlato, non riesco ad accedere all'apice https://127.0.0.1:8080/apex(anche se le autorizzazioni sembrano soddisfacenti).

Quindi dove altro dovrei cercare?

Aggiornamento con le informazioni richieste:

SQL> show parameter service_names

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
service_names                        string      XE
SQL> show parameter local_listener

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
local_listener                       string

Update2 : come sottolinea correttamente @ miracle173, l'ascoltatore non stava bene. Con il parametro 'local_listener' aggiornato ora vengono visualizzate ulteriori informazioni:

Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1ipc)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=machine.domain.com)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521)))
Services Summary...
Service "CLRExtProc" has 1 instance(s).
  Instance "CLRExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "PLSExtProc" has 1 instance(s).
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "XEXDB" has 1 instance(s).
  Instance "xe", status READY, has 1 handler(s) for this service...
Service "xe" has 1 instance(s).
  Instance "xe", status READY, has 1 handler(s) for this service...
The command completed successfully

Quali sono i valori del INSTANCE_NAMEparametro di inizializzazione e ORACLE_SIDdella variabile di ambiente? Il tuo database non si registra con il listener predefinito per qualche motivo. Provare a emettere alter system register;e quindi riconnettersi al database.
Yasir Arsanukaev l'

@YasirArsanukaev nome_istanza è 'xe' (minuscolo se rilevante) e non ho una variabile d'ambiente ORACLE_SID.
affettato

3
due note: "l'ascoltatore sembra a posto": non credo perché non visualizza un servizio chiamato "XE" "Posso eseguire il ping del servizio XE": tnsping si collega all'ascoltatore ma non si preoccupa dei servizi. quindi puoi mostrare solo se il listener è attivo e in esecuzione ma non puoi usare ist per verificare se il listener ha registrato un servizio. Quindi tnsping "(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST = localhost) (PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE)))" avrà esito positivo se un ascoltatore è in esecuzione sulla porta 1521 di localhost anche se il servizio non esiste.
miracle173

Oggi ho riscontrato lo stesso problema e, come descritto da @ miracle173, c'è una registrazione in alert.log. Oracle è in esecuzione su una macchina virtuale. Si scopre che sulla VM, sia hostname che hostname.domain puntano tutti a un indirizzo IP diverso da 127.0.0.1 (localhost). Dopo aver modificato il file hosts (Windows \ system32 \ drivers \ etc) per forzare la mappatura, ora tutto va bene.

alter register ha risolto il problema .. grazie :)
user116258

Risposte:


15

Quindi, grazie a @YasirArsanukaev per il tempo che ha inserito, ho trovato una soluzione che funziona, ma che non posso davvero spiegare.

Riflettendo sul LOCAL_LISTENERpensiero, stavo leggendo quest'altra risposta in cui diceva:

Il database utilizza il parametro LOCAL_LISTENER per identificare il listener con cui dovrebbe registrarsi. Di default è null, che secondo la documentazione equivale al nome host: 1521.

Quindi ho provato a eseguire il ping del mio nome host e non ci sono riuscito: sembra un problema IPv6, che riceve un messaggio di errore generale.

Quindi ho preso il consiglio da quella risposta

SQL> alter system set LOCAL_LISTENER='(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))' scope=both;
SQL> alter system register;

e ora funziona, presumibilmente perché può risolvere il riferimento localhost, dove non è riuscito a risolvere il nome host effettivo.


1
hai effettivamente eliminato la soluzione: la regressione automatica del database sul valore predefinito LOCAL_LISTENER = '(ADDRESS = (PROTOCOL = TCP) (HOST = hostname) (PORT = 1521))' (dove hostname è il nome di rete della macchina) non funziona perché esiste un problema per raggiungere la macchina con questo nome. Forse c'è una voce in alert.log o in qualche sqnlnet.log (% ORACLE_HOME% / network / log /) sul problema di registrazione del database
miracle173

@Unsliced ​​In realtà ho lo stesso problema, nel mio caso è stato risolto perché l'ID del servizio utilizzato ha rimosso il testo del postfisso ".Domain.local".
Nap

l'esecuzione delle due istruzioni alter ha risolto il messaggio di errore del listener tns per me e sono stato in grado di connettermi
smartexpert
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.