Dispatchers et ports spécifiques (avec des firewalls)

Contrairement à la plupart des paramètres, le paramètre dispatchers est modifié de manière incrémentale lorsque vous le positionnez avec la commande alter system set ... scope=memory|both. Autrement dit, le paramètre résultant est généralement la concaténation de l’ancienne valeur du paramètre et la valeur passée en paramètre sauf si la clause address ou description existe déjà auquel cas la section correspondante est simplement modifiée. Pour faciliter la lisibilité de vos configurations, vous préfèrerez toujours utiliser la clause INDEX qui permet de spécifier la section modifiée dans votre paramètre, à condition qu’il n’y ait pas de clause correpondante dans une autre section…

Dans cet article, vous trouverez quelques tests qui mettent en oeuvre ce paramètre avec des ports tcp fixes pour ceux qui ont leur base de données derrière un firewall. Vous verrez également comment arrêter et redémarrer des dispatchers.

Positionnez 3 dispatchers sur les adresses 25000, 25001 et 25002

INDEX a des valeurs inclues entre 0 et 999 ; pour configurer 3 dispatchers sur les ports 25000, 25001 et 25002, lancez la commande ci-dessous :

alter system set dispatchers='(ADDRESS=(PROTOCOL=TCP)(HOST=red)(PORT=25000))(INDEX=0)'
scope=both;
alter system set dispatchers='(ADDRESS=(PROTOCOL=TCP)(HOST=red)(PORT=25001))(INDEX=1)'
scope=both;
alter system set dispatchers='(ADDRESS=(PROTOCOL=TCP)(HOST=red)(PORT=25002))(INDEX=2)'
scope=both;

col network format a60
set lines 120
select name, network, status from v$dispatcher;

NAME NETWORK STATUS
---- ------------------------------------------------------------ ----------------
D000 (ADDRESS=(PROTOCOL=tcp)(HOST=red.easyteam.fr)(PORT=25000)) WAIT
D001 (ADDRESS=(PROTOCOL=tcp)(HOST=red.easyteam.fr)(PORT=25001)) WAIT
D002 (ADDRESS=(PROTOCOL=tcp)(HOST=red.easyteam.fr)(PORT=25002)) WAIT


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

VALUE
--------------------------------------------------------------------------------------------
(ADDRESS=(PROTOCOL=TCP)(HOST=red)(PORT=25000)), (ADDRESS=(PROTOCOL=TCP)(HOST=red)(PORT=25001)),
(ADDRESS=(PROTOCOL=TCP)(HOST=red)(PORT=25002))

Arrêter un dispatcher

Pour arrêter un dispatcher, utilisez une commande comme celle ci-dessous; le status du dispatcher passe à TERMINATE :

alter system shutdown immediate 'D000';

col network format a60
set lines 120
select name, network, status from v$dispatcher;

NAME NETWORK STATUS
---- ------------------------------------------------------------ ----------------
D000 (ADDRESS=(PROTOCOL=tcp)(HOST=red.easyteam.fr)(PORT=25000)) TERMINATE
D001 (ADDRESS=(PROTOCOL=tcp)(HOST=red.easyteam.fr)(PORT=25001)) WAIT
D002 (ADDRESS=(PROTOCOL=tcp)(HOST=red.easyteam.fr)(PORT=25002)) WAIT

Si vous attendez quelques instants, la ligne disparait de vue v$dispatchers :

col network format a60
set lines 120
select name, network, status from v$dispatcher;

NAME NETWORK STATUS
---- ------------------------------------------------------------ ----------------
D001 (ADDRESS=(PROTOCOL=tcp)(HOST=red.easyteam.fr)(PORT=25001)) WAIT
D002 (ADDRESS=(PROTOCOL=tcp)(HOST=red.easyteam.fr)(PORT=25002)) WAIT

Notez bien que le paramètre dispatchers n’est pas modifié dans ce cas et que si vous redémarrer l’instance, le dispatcher correspondant sera republié.

Redémarrer les dispatchers

Pour redémarrer un dispatcher, il suffit de relancer la commande alter system comme ci-dessous :

alter system set dispatchers='(ADDRESS=(PROTOCOL=TCP)(HOST=red)(PORT=25000))(INDEX=0)'
scope=both;

col network format a60
set lines 120
select name, network, status from v$dispatcher;

NAME NETWORK STATUS
---- ------------------------------------------------------------ ----------------
D000 (ADDRESS=(PROTOCOL=tcp)(HOST=red.easyteam.fr)(PORT=25000)) WAIT
D001 (ADDRESS=(PROTOCOL=tcp)(HOST=red.easyteam.fr)(PORT=25001)) WAIT
D002 (ADDRESS=(PROTOCOL=tcp)(HOST=red.easyteam.fr)(PORT=25002)) WAIT

Et si vous voulez changez le paramètre ?

Il est possible de modifier la paramètre de manière non incrémentale; pour cela, il suffit d’utiliser la clause scope=spfile comme vous les découvrirez ci-dessous :

alter system set dispatchers='(ADDRESS=(PROTOCOL=TCP)(HOST=red)(PORT=25000))'
scope=spfile;

col sid format a5
col value format a60
select sid, value from v$spparameter where name='dispatchers';

SID VALUE
----- -------------------------------------------------------
BLACK (ADDRESS=(PROTOCOL=TCP)(HOST=red)(PORT=25000))

select value from v$parameter where name='dispatchers';
VALUE
------------------------------------------------------------
(ADDRESS=(PROTOCOL=TCP)(HOST=red)(PORT=25000)),
(ADDRESS=(PROTOCOL=TCP)(HOST=red)(PORT=25001)),
(ADDRESS=(PROTOCOL=TCP)(HOST=red)(PORT=25002))

Voilà pour ce qui est de l’utilisation des dispatchers avec des firewalls. Regardez la documentation associée pour en savoir plus sur les autres options qui s’avèreront très utiles dans d’autres cas un peu plus avancées et notamment avec des clusters. Notez bien que Database Resident Connection Pool utilise une configuration similaire mais qu’en l’occurrence il n’est pas possible de fixer les ports (cf 953277.1). Pour contourner le problème dans ce dernier cas, il faudra utiliser Connection Manager mais ça c’est déjà une autre histoire…