vendredi 30 mai 2014

L'importance du LOCAL_LISTENER

J'ai été alerté aujourd'hui par des utilisateurs qui obtenaient l'erreur ci-dessous lorsqu'ils souhaitaient accéder à une base de pré-production:
ERROR:

ORA-01034: ORACLE not available

ORA-27101: shared memory realm does not exist

HPUX-ia64 Error: 2: No such file or directory

ID de processus : 0

ID de session : 0,  Numéro de série : 0

En général je vois cette erreur lorsqu'on tente d'accéder à une base qui est arrêtée. Pourtant pour cette base j'arrivais à me connecter localement sans problème et la base est bien OPEN. Néanmoins, lorsque je me connectais à distance j'obtenais le même message que les utilisateurs:
ihgbdd@vp2186:/projets/ihg/home/ihgbdd $  sqlplus user_test/USER_TEST_#1@PMIP00

SQL*Plus: Release 11.2.0.3.0 Production on Mar. Mai 27 14:42:41 2014

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

ERROR:

ORA-01034: ORACLE not available

ORA-27101: shared memory realm does not exist

HPUX-ia64 Error: 2: No such file or directory

ID de processus : 0

ID de session : 0,  Numéro de série : 0

C'est donc que le problème ne se situait pas au niveau de l'instance elle-même mais plutôt au niveau de la configuration OracleNet.
Une connexion Easy Connect me donnait le même message d'erreur:
ihgbdd@vp2186:/projets/ihg/home/ihgbdd $  sqlplus user_test/USER_TEST_#1@psu459:1550/PMIP00

SQL*Plus: Release 11.2.0.3.0 Production on Mar. Mai 27 14:43:37 2014

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

ERROR:

ORA-01034: ORACLE not available

ORA-27101: shared memory realm does not exist

HPUX-ia64 Error: 2: No such file or directory

ID de processus : 0

ID de session : 0,  Numéro de série : 0

Le TNSPING par contre fonctionnait bien.
ihgbdd@vp2186:/projets/ihg/home/ihgbdd/RUB/RUB1.100.11 $ tnsping pmip00

TNS Ping Utility for Linux: Version 11.2.0.3.0 - Production on 27-MAI  -2014 14:38:52

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

Fichiers de paramètres utilisés :

/soft/oracle/product/client/11.2.0.3/network/admin/sqlnet.ora

Adaptateur TNSNAMES utilisé pour la résolution de l'alias

Tentative de contact de (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = psu459)(PORT = 1550))) (CONNECT_DATA = (SERVICE_NAME = PMIP00)))

OK (20 msec)

J'en concluais donc que le listener était bien démarré et qu'il écoutait sur le port 1550 qui (vous l'aurez sans doute noter) ne correspond pas au numéro de port par défaut.

A ce moment là me sont revenus mes souvenirs des cours d'admin Oracle DBA1: Pour que l'enregistrement dynamique d'une instance auprès du listener se fasse il faut 
- soit utiliser le nom et le port du listener par défaut 
- soit (si le nom ou le port ne sont pas ceux par défaut) définir une entrée TNS comme valeur du paramètre LOCAL_LISTENER.
Je suis donc allé vérifier ce que me donnait la valeur de ce paramètre pour ma base en question:
SQL> sho parameter listener

NAME                                 TYPE        VALUE

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

listener_networks                    string

local_listener                       string

remote_listener                      string

Comme je me doutais, le paramètre n'était pas setté.

Voilà donc la cause de mon problème. Sans cette indication l'instance ne sait pas auprès de quel listener il doit s'enregistrer ni comment le contacter. Ce paramètre est censé lui indiquer le nom du listener ainsi que le numéro du port écouté par ce listener.

Comme j'ai un fichier TNSNAMES.ora sur mon serveur de données j'ai pu lui indiquer directement le nom de l'alias TNS pour la base en question :
SQL>  alter system set local_listener='PMIP00';

System altered.

Si je n'avais pas de fichier TNSNAMES.ora il aurait fallu que j'indique comme valeur du paramètre la partie ADDRESS de l'entrée TNS: (ADDRESS = (PROTOCOL = TCP)(HOST = psu459)(PORT = 1550)).

Une fois le paramètre setté l'accès à la base peut s'effectuer sans problème
hgbdd@vp2186:/projets/ihg/home/ihgbdd $ sqlplus user_test/USER_TEST_#1@PMIP00

SQL*Plus: Release 11.2.0.3.0 Production on Mar. Mai 27 15:19:25 2014

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

Connecté à :

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL>


CONCLUSION:
Si vous n'utilisez pas les valeurs par défaut pour un LISTENER il faut bien penser à setter le paramètre LOCAL_LISTENER sinon l'enregistrement automatique de votre instance auprès du LISTENER ne pourra se faire et vos connexions distantes à la base ne fonctionneront pas.