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.
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)
4) Il Server Process controlla le credenziali di autenticazione dell'utente (es. password) e se valide crea una Sessione Utente.
Il nome del listener è scritto nel file listener.ora
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
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> 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
Vediamo il file tnsnames.ora
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.
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
- 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 e 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)
ps -ef | grep tns
- 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.
[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*
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
#locate listener.log
# 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
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.
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.