Le LISTENER et la liste des services

Le processus LISTENER écoute les requêtes entrantes sur un port de réseau. Lorsqu'il reçoit une requête, il la transmet à un gestionnaire de service, c'est-à-dire à un processus serveur qui s'exécute sur le même système que le serveur Oracle. Il peut s'agir d'un processus serveur dédié ou d'un dispatcher, ce dernier collaborant avec des processus serveur partagés.

en savoir

L’enregistrement automatique

Le processus LISTENER a une liste des services de base de données desservies. Il refuse automatiquement la connexion à une base de données qui n'est pas dans sa liste.

Il existe deux modalités d’inscription dans cette liste :

— L’enregistrement automatique.

L’enregistrement statique en configurant le fichier « listener.ora ».

Une base de données Oracle 11g peut enregistrer automatiquement dans la liste de base de données desservies. Le processus « PMON » est responsable de l'enregistrement de cette information. Attention, il n’effectue l’opération pour le processus LISTENER par défaut que si le port d’écoute est « 1521 ». L’enregistrement dynamique n’est pas immédiat ; il y a une période de latence, pendant laquelle les clients ne peuvent pas se connecter.

[oracle@jupiter ~]$ lsnrctl stop

...

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=jupiter.olimp.fr)(PORT=1521)))

The command completed successfully

[oracle@jupiter ~]$ lsnrctl start

LSNRCTL for Linux: Version 12.1.0.1.0 - Production on 06-MAR-2014 18:06:55

...

The listener supports no services

The command completed successfully

[oracle@jupiter ~]$ lsnrctl status

LSNRCTL for Linux: Version 12.1.0.1.0 - Production on 06-MAR-2014 18:06:58

...

The listener supports no services

The command completed successfully

[oracle@jupiter ~]$ lsnrctl status

LSNRCTL for Linux: Version 12.1.0.1.0 - Production on 06-MAR-2014 18:07:00

...

Services Summary...

Service "diamant.olimp.fr" has 1 instance(s).

  Instance "gemmes", status READY, has 1 handler(s) for this service...

Service "gemmes.olimp.fr" has 1 instance(s).

  Instance "gemmes", status READY, has 1 handler(s) for this service...

Service "gemmesXDB.olimp.fr" has 1 instance(s).

  Instance "gemmes", status READY, has 1 handler(s) for this service...

The command completed successfully

LOCAL_LISTENER

Chaque fois qu’une base de données démarre est insérée dans la liste du processus LISTENER, mais de même, quand une base de données est arrêtée elle est retirée de la liste des bases de données. Alors, si vous vous connectez en utilisant Oracle Net et vous arrêtez votre base de donnée, elle est retirée automatiquement de la liste.

Attention, par défaut l’insertion est effectué uniquement dans la liste du processus LISTENER utilisant le port « 1521 », pour les configurations des processus LISTENER qui ont un port d’écoute autre que le « 1521 », vous devez initialiser le paramètre « LOCAL_LISTENER » dans votre fichier paramètre. Dans l’exemple suivant, le processus LISTENER a un port d’écoute « 1526 » ; ainsi le « PMON » n’initialise pas automatiquement la liste des bases de données. Dés que l’initialisation du paramètre « LOCAL_LISTENER » est effective, la base de données « quartz » est initialisée dans la liste.

[oracle@jupiter ~]$ . oraenv

ORACLE_SID = [gemmes] ?

The Oracle base remains unchanged with value /u01/app/oracle

[oracle@jupiter ~]$ echo $ORACLE_SID $ORACLE_HOME

gemmes /u01/app/oracle/product/12.1.0/db_home

[oracle@jupiter ~]$ cat $TNS_ADMIN/listener.ora

LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = TCP)(HOST = jupiter.olimp.fr)(PORT = 1526))               <-----

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

    )

  )

[oracle@jupiter ~]$ lsnrctl services

...

Connexion à (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=jupiter.olimp.fr)(PORT=1526)))

Le processus d'écoute ne prend en charge aucun service 

La commande a réussi

SQL> alter system set local_listener=

  2  '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=jupiter.olimp.fr)(PORT=1526)))';

Système modifié.

SQL> !lsnrctl services

...

Connexion à (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=jupiter.olimp.fr)(PORT=1526)))

Récapitulatif services...             

Le service "gemmes.olimp.fr" comporte 1 instance(s).

  L'instance "gemmes", statut READY, comporte 1 gestionnaire(s) pour ce service...

    Gestionnaire(s) :

      "DEDICATED" établi : 0 refusé : 0 statut : ready

         LOCAL SERVER

...

La commande a réussi

Les multiples processus LISTENER

Il est possible de déclarer plusieurs processus LISTENER définis pour un service de base de données, ce qui présente certains avantages dans les environnements complexes, parmi lesquels :

reprise de fonction transparente d'un module LISTENER défaillant ;

équilibrage de charge.

Voici un exemple du fichier « listener.ora » configuré pour démarrer quatre modules, un par défaut appelé LISTENER et un pour chaque base de données, « ambre », « jade » et « quartz » installées sur le serveur « gaia.etelia.fr ». Le nom de chaque processus LISTENER supplémentaires est composé de la sorte :  'LSNR_' + « db_name »

C:\>type %TNS_ADMIN%\listener.ora

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (SID_NAME = CLRExtProc)

      (ORACLE_HOME = O:\app\oracle\product\12.1.0\db_home)

      (PROGRAM = extproc)

      (ENVS = "EXTPROC_DLLS=ONLY:O:\app\oracle\product\12.1.0\db_home\bin\oraclr12.dll"))

    (SID_DESC =

      (GLOBAL_DBNAME = pierres.olimp.fr)

      (ORACLE_HOME = O:\app\oracle\product\12.1.0\db_home)

      (SID_NAME = pierres)))

SID_LIST_LSNR_AMBRE =(SID_DESC =(GLOBAL_DBNAME = ambre.olimp.fr)

      (ORACLE_HOME = O:\app\oracle\product\12.1.0\db_home)(SID_NAME = pierres))

SID_LIST_LSNR_EMERAUDE = (SID_DESC = (GLOBAL_DBNAME = emeraude.olimp.fr)

      (ORACLE_HOME = O:\app\oracle\product\12.1.0\db_home)(SID_NAME = pierres))

...

LISTENER =(DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = TCP)(HOST = gaia.olimp.fr)(PORT = 1521))

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))))

LSNR_AMBRE =

 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=gaia.olimp.fr)(PORT=1522)))

LSNR_EMERAUDE =

 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=gaia.olimp.fr)(PORT=1523)))

LSNR_HEMATITE =

 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=gaia.olimp.fr)(PORT=1524)))

LSNR_JASPE =

 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=gaia.olimp.fr)(PORT=1525)))

Chaque processus LISTENER nouveau n’a qu’une seule base de données dans sa liste de base de données. Voici dans l’exemple suivant comment lancer les trois nouveaux processus.

C:\> lsnrctl start

LSNRCTL for 64-bit Windows: Version 12.1.0.1.0 - Production on 06-MARS -2014 21:06:08

...

Le service "pierres.olimp.fr" comporte 1 instance(s).

  L'instance "pierres", statut UNKNOWN, comporte 1 gestionnaire(s) pour ce service...

La commande a réussi

C:\>lsnrctl start lsnr_ambre

LSNRCTL for 64-bit Windows: Version 12.1.0.1.0 - Production on 06-MARS -2014 21:06:21

Enter oracle's password : XXXX

...

Le service "ambre.olimp.fr" comporte 1 instance(s).

  L'instance "pierres", statut UNKNOWN, comporte 1 gestionnaire(s) pour ce service...

La commande a réussi

C:\>lsnrctl start lsnr_emeraude

LSNRCTL for 64-bit Windows: Version 12.1.0.1.0 - Production on 06-MARS -2014 21:08:11

Enter oracle's password : XXXX

...

Le service "emeraude.olimp.fr" comporte 1 instance(s).

  L'instance "pierres", statut UNKNOWN, comporte 1 gestionnaire(s) pour ce service...

La commande a réussi

...

Le descripteur de connexion pour chaque base de données peut être utilisé avec deux adresses pour résoudre le nom de base de données. Ainsi pour une connexion qui précise l’accès utilisant les deux adresses des processus LISTENER, la connexion est effectuée même si l’un des module n’est pas actif.

C:\> type %TNS_ADMIN%\tnsnames.ora

PIERRES =

  (DESCRIPTION =

    (ADDRESS=(PROTOCOL=TCP)(HOST=gaia.olimp.fr)(PORT=1521)) ))                         <-----

    (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=pierres.olimp.fr)))

LISTENER_PIERRES =

  (ADDRESS=(PROTOCOL=TCP)(HOST=gaia.olimp.fr)(PORT=1521))

AMBRE =

  (DESCRIPTION =

    (ADDRESS=(PROTOCOL=TCP)(HOST=gaia.olimp.fr)(PORT=1522))                            <-----

    (ADDRESS=(PROTOCOL=TCP)(HOST=gaia.olimp.fr)(PORT=1521))

    (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ambre.olimp.fr)))

...

C:\>sqlplus sys/Razvanpwd3@pierres as sysdba

Connecté à une instance inactive.

SYS@pierres>startup

Instance ORACLE lancée.

Base de données montée.

Base de données ouverte.

SYS@pierres>$lsnrctl stop

...

Connexion à (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=gaia.olimp.fr)(PORT=1521)))

La commande a réussi

SYS@pierres>connect sys/Razvanpwd3@ambre as sysdba

Connecté.

SYS@ambre>select name, open_mode, restricted from v$pdbs;

NAME                           OPEN_MODE  RES

------------------------------ ---------- ---

AMBRE                          READ WRITE NO

SYS@pierres>connect sys/Razvanpwd3@pierres as sysdba

ERROR:

ORA-12541: TNS : pas de processus d'écoute

Avertissement : vous n'êtes plus connecté à ORACLE.

@>

Si vous utilisez le service Oracle Restart, il est impératif d’attacher chaque service LISTENER créé pour qu’il soit démarré automatiquement avec toute l’infrastructure. La première étape consiste à arrêter chaque LISTENER, puis à ajouter la description de chaque LISTENER dans le référentiel. Finalement vous pouvez démarrer chaque LISTENER service à l’aide de l’utilitaire « srvctl ».

C:\>lsnrctl stop lsnr_ambre

...

Connexion à (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=gaia.olimp.fr)(PORT=1522)))

La commande a réussi

C:\>lsnrctl stop lsnr_emeraude

...

Connexion à (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=gaia.olimp.fr)(PORT=1523)))

La commande a réussi

C:\>lsnrctl stop lsnr_hematite

...

Connexion à (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=gaia.olimp.fr)(PORT=1524)))

La commande a réussi

C:\>lsnrctl stop lsnr_jaspe

...

Connexion à (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=gaia.olimp.fr)(PORT=1525)))

La commande a réussi

C:\>srvctl add listener -l lsnr_ambre -p TCP:1522 -o O:\app\oracle\product\12.1.0\db_home

C:\>srvctl add listener -l lsnr_emeraude -p TCP:1523 -o O:\app\oracle\product\12.1.0\db_home

C:\>srvctl add listener -l lsnr_hematite -p TCP:1524 -o O:\app\oracle\product\12.1.0\db_home

C:\>srvctl add listener -l lsnr_jaspe -p TCP:1525 -o O:\app\oracle\product\12.1.0\db_home

C:\>srvctl config listener

Nom : LISTENER

RÚpertoire d'origine : O:\app\oracle\product\12.1.0\db_home

Adresses : TCP:1521

Nom : LSNR_AMBRE

RÚpertoire d'origine : O:\app\oracle\product\12.1.0\db_home

Adresses : TCP:1522

Nom : LSNR_EMERAUDE

RÚpertoire d'origine : O:\app\oracle\product\12.1.0\db_home

Adresses : TCP:1523

Nom : LSNR_HEMATITE

RÚpertoire d'origine : O:\app\oracle\product\12.1.0\db_home

Adresses : TCP:1524

Nom : LSNR_JASPE

RÚpertoire d'origine : O:\app\oracle\product\12.1.0\db_home

Adresses : TCP:1525

C:\>srvctl start listener -l lsnr_ambre

C:\>srvctl start listener -l lsnr_emerau

C:\>srvctl start listener -l lsnr_hemati

C:\>srvctl start listener -l lsnr_jaspe

C:\>crsctl stop has

...

CRS-2677: Stop of 'ora.LSNR_AMBRE.lsnr' on 'gaia' succeeded

CRS-2677: Stop of 'ora.LSNR_EMERAUDE.lsnr' on 'gaia' succeeded

CRS-2677: Stop of 'ora.LISTENER.lsnr' on 'gaia' succeeded

CRS-2677: Stop of 'ora.LSNR_JASPE.lsnr' on 'gaia' succeeded

CRS-2677: Stop of 'ora.LSNR_HEMATITE.lsnr' on 'gaia' succeeded

...