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:
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:
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:
Le TNSPING par contre fonctionnait bien.
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
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:
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 :
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
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.
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.
Salut Ahmed, tu pourrais rajouter quelques informations sur l'utilisation du local_listener dans le cas du rac one node avec plusieurs listener. Je connais un DBA qui a fait un wiki sur le sujet, je pense pas qu'il t'en voudra si tu t'en inspires :=). Par contre essaye de cache le nom des serveurs, en terme de sécurité c'est pas génial que de mettre de vrai exemple
RépondreSupprimer