Listener: connessione - sessione

Il Listener (o Oracle Net Listener) è un processo non vitale al mantenimento dello status open del database.
E' il punto di accesso del client oracle e dell'Application Server all'istanza oracle database.
Una volta istaurata una sessione il Listener può anche essere stoppato.
Con il listener giù, le sessioni attive continuano ad interrogare la base dati mentre una nuova connessione riceve il messaggio: Eccezione IO: The Network adapter could not establish the connection.







Vediamo gli step del processo:

1) Ad esempio quando un utente si collega ad SQL*PLUS ed usa l'opzione /nolog  avvia SQL*Plus senza connettersi a un database; quindi è necessario immettere CONNECT seguito dal nome utente e password e dal nome del service name.

2) A questo punto il Listener riceve il  pacchetto CONNECT che contiene il service name e se non valido il Listener trasmette un codice di errore al processo utente. Il listener è in ascolto sul protocollo tcp/ip all'indirizzo ADDRESS=(PROTOCOL=tcp)(HOST=hostname)(PORT=1521)

3) Se invece è valido, il Listener genera un Server Process che gestisce la connessione.

4) Il Server Process controlla le credenziali di autenticazione dell'utente (es. password) e se valide crea una Sessione Utente.

Le informazioni che deve conoscere il Client per stabilire una connessione sono:
- indirizzo ip o host in cui risiede il listener
- protocollo utilizzato dal listener
- porta monitorata da listener
- nome del servizio a cui connettersi

Di seguito i metodi di connessione al db:
  • Metodo Easy Connect: usa la stringa di connessione tcp/ip
  • SQL> connect username/password@host[:port][/service_name]

  • Metodo Local Naming: usa il file di configurazione tnsnames.ora lato client.
  • SQL> connect username/password@tnsnames.ora_entry
  • Metodo Directory Namig: utilizza sistemi centralizzati di directory come LDAP.
  • SQL> connect username/password@service_name 
  • External naming: utilizza un servizio di identificazione di terza parte.

Si può inviare anche una pacchetto senza service name tramite la utility TNSPING che verifica se il nome host, la porta e il protocollo raggiungono un listener, ma non controlla se il listener gestisce il service name. 
# tnsping nome_host:porta/<nome servizio>

Connessione Sessione sono strettamente legate al processo utente ma mentre la Connessione è un canale di comunicazione fisico (tcp/ip è il principale protocollo di rete) tra un processo utente e un Istanza, la Sessione è un entità logica del database e rappresenta lo stato di login di un utente all'istanza di un db.
La durata della sessione è compresa da quando l'utente si connette fino a quando si disconnette.

Per vedere se ci sono listener attivi sulla macchina eseguire il comando seguente.
ps -ef | grep tns


I file di configurazione del Listener in $ORACLE_HOME/network/admin sono:
 - listener.ora (da configurare lato server) è il responsabile della ricezione delle richieste del client
 - sqlnet.ora  (da configurare lato client e server)
 - tnsnames.ora (da configurare lato client e server) 

Il nome del listener è scritto nel file listener.ora

[oracle@test admin]$ vi listener.ora

# listener.ora Network Configuration File: /u01/app/oracle/product/18/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = test.com)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

Questo è il listener di defult di nome LISTENER che viene creato durante l'installazione del db da Oracle Net Configuration Assistant.

Se si utilizza il protocollo TCP e la porta standard 1521 questo file può essere anche cancellato perchè il "dynamic service registration" registra in automatico i servizi e ciò avviene perchè il listener locale è scritto nel file tnsnames.ora. Nell'esempio si chiama LISTENER_ORCL.

[oracle@test admin]$ vi tnsname.ora

LISTENER_ORCL =
      (ADDRESS = (PROTOCOL = TCP)(HOST =test.com)(PORT = 1521))

SQL> show parameter local_listener

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

Se VALUE è null vuol dire che assume il valore di default che è:
(ADDRESS = (PROTOCOL=TCP)(HOST=hostname)(PORT=1521)) dove hostname è il network name del local host.


Comandi per l'esecuzione del LISTENER

[oracle@dbserver1 ~]$ cd $ORACLE_HOME/bin
lsnrctl status | start | stop

oppure usare l'utility

[oracle@dbserver1 bin]$ lsnrctl

LSNRCTL> help
The following operations are available
An asterisk (*) denotes a modifier or extended command:

start           stop            status          services        
servacls        version         reload          save_config     
trace           spawn           quit            exit            
set*            show*           

LSNRCTL> status
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=....)(PORT=1521))
TNS-12541: TNS:no listener
 TNS-12560: TNS:protocol adapter error
  TNS-00511: No listener
   Linux Error: 111: Connection refused

Di defult il nome del listener è "LISTENER" altrimenti usare il nome presente nel file listener.ora.
Ad esempio:
LSNRCTL> set current_list LIST_SALES
Current Listener is LIST_SALES
LSNRCTL> status
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dbserver1.localdomain)(PORT=1521)))
TNS-12541: TNS:no listener
 TNS-12560: TNS:protocol adapter error
  TNS-00511: No listener
   Linux Error: 111: Connection refused
LSNRCTL> START | STOP
oppure senza settare il nome del listener:
LSNRCTL> STOP LIST_SALES
oppure:
[oracle@dbserver1 bin]$ lsnrctl start list_sales;


Per vedere i log del listener eseguire il comando
# lsnrctl status
....
Listener Parameter File   /u01/app/oracle/product/11gR24/network/admin/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/dbserver1/listener/alert/log.xml
.....

Oppure con il comando seguente.
#locate listener.log

Vediamo il file tnsnames.ora 

# tnsnames.ora Network Configuration File: /u01/app/oracle/product/18/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
LISTENER_ORCL =
  (ADDRESS = (PROTOCOL = TCP)(HOST = test.com)(PORT = 1521))

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = test.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl.com)
    )
  )

LISTENER_ORCL è il listener locale
ORCL è l'entry code o "tnsname entry" del file tnsnames che punta al service name "orcl.com" che punta al database oracle. 


Esistono due tipi di Server Process: Dedicated Server e Shared Server.
Dedicated Server Process stabilisce una relazione 1 a 1 tra connessione e sessione come visibile nella prima immagine. Al contrario uno Shared Server Process prevede che più connessioni condividono lo stesso Server Process. Come visibile nella seguente immagine la richiesta di un client, tramite il Listener (step 1 e 2), passa ad un Dispatcher (setp 3) che lo mette in una coda  presente all'interno della SGA.


Dopodiché la richiesta viene evasa dai Server Process e il risultato posto all'interno di una coda presente nello SGA . Nel frattempo il Dispatcher interroga la suddetta coda e quando trova una risposta la restituisce al Client di competenza.

Post popolari in questo blog

ORA-12154: TNS: il listener non è attualmente a conoscenza del servizio richiesto nel descrittore di connessione

Create e Drop Pluggable Database