Configuration statique Oracle Net et EZCONNECT

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 ou listener_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 guise
  • SID_LIST contient la liste des instances/services que vous enregistrez de manière statique
  • GLOBAL_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’instance
  • SID_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 instance
  • ORACLE_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 listener

    Pour 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”

  1. 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é.

  2. 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.