Vous trouverez ci-dessous 2 petits mots à propos de l’enregistrement statique des instances et des services dans le listener ainsi que la syntaxe EZCONNECT pour forcer l’utilisation d’une instance.
Comme vous le savez, depuis la fin les années 90 (:-P), il est recommandé de se connecter via un service à vos instances. Le service virtualise l’accès aux instances dans la mesure où vous le publiez depuis le paramètre service_names
de l’instance ou avec les commandes srvctl XXX service
dans l’infrastructure Grid. L’utilisation d’un service permet :
- de décorréler les instances et les clients et de mettre en place des mécanismes de reprise automatique ou manuel des instances
- lorsqu’il est utilisé avec les paramètres
remote_listener
oulistener_networks
, de décorréler le nom du serveur via une adresse virtuelle ou une adresse SCAN du client - d’identifier la nature des activités dans une base de données
- de gérer des priorités dans l’allocation des ressources
- de distinguer les versions des objets (éditions) que vous utilise
Bref, les services sont un outil parfait pour adresser simplement nombre de configurations réseau.
Evidemment, encore faut-il savoir les utiliser même lorsqu’on n’est plus intéressé par la virtualisation des accès et que l’on veut se connecter à une instance en particulier. De la même manière, il faut pouvoir se connecter même si l’instance est arrêtée pour la démarrer ou la basculer dans le cas d’une standby…
Enregistrement statique des services
En général, les services sont enregistrés dynamiquement dans le listener par PMON ; pour tout savoir sur ce fonctionnement et comment le tracer à l’aide de l’event 10257, reportez-vous à la note « How to Trace Dynamic Registration from PMON ? [ID 787055.1] » sur My Oracle Support.
Il y a plusieurs cas dans lesquels vous pouvez avoir besoin de vous connecter à distance alors que l’instance est arrêtée. C’est notamment le cas lorsque vous cherchez à vous connecter SYSDBA
et via RMAN
pour, par exemple, exécuter une commande duplicate
ou restore controlfile
. Il faut alors enregistrer les instances et les services de manière statique. Pour cela, ajoutez une section comme celle ci-dessous dans votre fichier listener.ora
:
SID_LIST_<LISTENER> =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = COMPTA)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)
(SID_NAME = BLACK)
)
)
Les paramètres utiles à cet enregistrement sont les suivants :
<LISTENER>
est le nom du listener dans lequel vous enregistrez vos instance/service. Par défaut on utilise un listener nomméLISTENER
mais vous pouvez aussi bien l’appeler à votre guiseSID_LIST
contient la liste des instances/services que vous enregistrez de manière statiqueGLOBAL_DBNAME
indique comme son nom ne le laisse pas forcément penser le nom de service avec lequel l’enregistrement statique est réalisé; si vous n’utilisez pas ce mot clé, le nom utilisé est le même que celui de l’instanceSID_NAME
est le nom de l’instance enregistrée de manière statique. Ce paramètre doit correspondre à la variable ORACLE_SID que vous utilisez pour démarrer votre instanceORACLE_HOME
est le répertoire d’installation du logiciel Oracle utilisé par votre instance
Une fois le fichier listener.ora
modifié, vous pouvez recharger le listener. Les commandes status
et service
de l’utilitaire de gestion du listener lsnrctl
montre un status UNKNOWN
pour l’instance ce qui est typique des configurations statiques :
$ lsnrctl status
LSNRCTL for Linux: Version 11.2.0.2.0 - Production on 07-MAY-2011 19:23:05
Copyright (c) 1991, 2010, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=red.easyteam.fr)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.2.0 - Production
Start Date 07-MAY-2011 16:14:41
Uptime 0 days 3 hr. 8 min. 23 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/11.2.0/db_2/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/red/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=red.easyteam.fr)(PORT=1521)))
Services Summary...
Service "COMPTA" has 1 instance(s).
Instance "BLACK", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
Se connecter à une instance spécifique
Pour vous connecter via un service et malgré tout garantir que vous êtes connecté à une instance donnée, utilisez le paramètre INSTANCE_NAME
comme dans l’alias TNS ci-dessous :
BLACK=(description=
(address=
(port=1521)(host=red.easyteam.fr)(protocol=tcp)
)
(connect_data=
(service_name=COMPTA)
(instance_name=BLACK)
)
)
Avec EZCONNECT
La syntaxe EZCONNECT permet également de spécifier un nom d’instance comme l’indique sa description dans la documentation :
CONNECT username@[//]host[:port][/service_name][:server][/instance_name]
Dans mon cas il suffit d’utiliser la syntaxe ci-dessous pour m’assurer que je me connecte bien à l’instance BLACK
:
sqlplus sys@red.easyteam.fr:1521/COMPTA/BLACK as sysdba
Notes complémentaires :
- Avec EZCONNECT, vous devrez toujours spécifier le nom du service avant le nom de l’instance. De sorte que si vous n’avez pas utilisé le paramètre
GLOBAL_DBNAME
, dans l’enregistrement statique, la chaine de connexion ressemblera àsys@red:1521/BLACK/BLACK
dans mon cas !- D’ailleurs, faites bien attention au paramètre NAMES.DIRECTORY_PATH dont la valeur par défaut est (tnsnames, ldap, ezconnect) en 11.2. Notez en particulier que cette valeur est différente selon les versions comme la 11.1. Evitez de mettre la méthode de résolution EZCONNECT avant TNSNAMES ou LDAP. En effet, si par mégarde, vous utilisez un nom d’alias qui est également un nom résolu par le votre serveur (DNS, /etc/hosts, …), vous risquez de rencontrer une erreur comme celle ci-dessous :
sqlplus sys/manager@black as sysdba
SQL*Plus: Release 11.2.0.2.0 Production on Sat May 7 19:55:15 2011
Copyright (c) 1982, 2010, Oracle. All rights reserved.
ERROR:
ORA-12541: TNS:no listenerPour comprendre ce qu’il se passe, la commande
tnsping
vous sera alors d’un grand secours… mais autant anticiper !
3 réflexions sur “Configuration statique Oracle Net et EZCONNECT”
Merci pour les précisions.
Il ne faut pas confondre
(1) Enregistrement statique, i.e. avec les paramètres qui vont bien dans le fichier listener.ora
(2) Utilisation du SID de l’instance.
On peut tout à fait enregistrer un service_name de manière statique ; lorsqu’on enregistre les services dans le listener dynamiquement, le SID est également enregistré.
Je me demande si l’enregistrement statique ne se fait pas par défaut.
Avec une configuration qui exclue un eenregistrement statique de ORACLE_SID:
$ cat listener.ora
LSNR_10G=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=tcp)(HOST=lx01)(PORT=1422))
# (ADDRESS=(PROTOCOL=ipc)(KEY=extproc))
)
)
#
#SID_LIST_LSNR_10G =
#(SID_LIST =
# (SID_DESC =
# (SID_NAME = PLSExtProc)
# (ORACLE_HOME = /u01/app/oracle/product/10.2.0/EE)
# (PROGRAM = extproc)
# )
#)
]$ tail -17 tnsnames.ora
#
LSNR_10G=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=tcp)(HOST=lx01)(PORT=1422))
(ADDRESS=(PROTOCOL=ipc)(KEY=extproc))))
10G =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = lx01)(PORT = 1422))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SID = DB102)
#(SERVICE_NAME = DB102)
)
)
$ tnsping 10g
TNS Ping Utility for Linux: Version 10.2.0.4.0 – Production on 25-JUL-2011 22:34:10
Copyright (c) 1997, 2007, Oracle. All rights reserved.
Used parameter files:
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = lx01)(PORT = 1422)) (CONNECT_DATA = (SERVER = DEDICATED) (SID = DB102)))
OK (10 msec)
SQL> show parameter local_l
NAME TYPE VALUE
———————————— ———– ——————————
local_listener string lsnr_10g
SQL> show parameter service_names
NAME TYPE VALUE
———————————— ———– ——————————
service_names string DB102
]$ lsnrctl services lsnr_10g
LSNRCTL for Linux: Version 10.2.0.4.0 – Production on 25-JUL-2011 22:30:27
Copyright (c) 1991, 2007, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=lx01)(PORT=1422)))
Services Summary…
Service « DB102 » has 1 instance(s).
Instance « DB102 », status READY, has 1 handler(s) for this service…
Handler(s):
« DEDICATED » established:1 refused:0 state:ready
LOCAL SERVER
Service « DB102XDB » has 1 instance(s).
Instance « DB102 », status READY, has 1 handler(s) for this service…
Handler(s):
« D000 » established:0 refused:0 current:0 max:1022 state:ready
DISPATCHER
(ADDRESS=(PROTOCOL=tcp)(HOST=lx01.localdomain)(PORT=38563))
Service « DB102_XPT » has 1 instance(s).
Instance « DB102 », status READY, has 1 handler(s) for this service…
Handler(s):
« DEDICATED » established:1 refused:0 state:ready
LOCAL SERVER
The command completed successfully
je peux quand même connecter en utilisant ORACLE_SID sans définir SERVICE_NAME:
[oracle@lx01 admin]$ sqlplus appli/appli@10g
SQL*Plus: Release 10.2.0.4.0 – Production on Mon Jul 25 22:31:59 2011
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 – Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> exit
je voudrais bien comprendre pourquoi ?
Les commentaires sont fermés.