Tuesday, December 20, 2005

BIEN COMPRENDRE LA NOTION DE « NOM DE SERVICE »
POUR EVITER LES ERREURS
« ORA-12154 :TNS :Could not resolve service name »

Introduction
Cet article fait le point sur une erreur commune fréquemment rencontrée par les nouveaux administrateurs Oracle et concernant Oracle net Services. Il constitue une traduction/adaptation d'un article apparue le 23 octobre 2003 sur le site Database Journal et dont l’auteur est Steve Callan et le titre : Avoiding the « ORA-12154 :TNS :culd not resolve service name error. »

Il est important de savoir configurer les fichiers tnsnames.ora et sqlnet.ora. Une mauvaise configuration de ces deux fichiers entraine une impossibilité de se connecter à la base de données. Et l’une des erreurs souvent rencontrées dans ce cas est « ORA-12154 :TNS :could not resolve service name. » Il n’est pas rare que les nouveaux utilisateurs d’Oracle passent des heures et des heures à essayer de comprendre cette erreur.
Généralités et contexte
Commençons par voir ce qui se passe lorsque l’utilisateur oracle tape nom_utilisateur/mot_de_passe@SID. Nous allons utiliser une connexion ordinaire scott/tiger et le nom de notre base de données sera dbaspt.
Après la saisie de nom_utilisateur/mot_de_passe@SID, Oracle va s’arrêter au fichier sqlnet.ora pour récupérer la valeur de la variable d’environnement NAMES.DEFAULT_DOMAIN, si elle existe. C’est le lieu de rappeler que lors de l’installation du logiciel Oracle et de la création de la base de données, l’utilisateur avait été invité à saisir le nom de dommaine de sa base.
Supposons qu’il avait entré « company.com » comme nom de domaine. Oracle va alors ajouter la valeur de la variable NAMES.DEFAULT_DOMAIN (ici company.com) à dbaspt, ce qui aboutit à la chaîne dbaspt.company.com.
Le fichier tnsnames.ora
Ensuite Oracle va s’arrêter au fichier tnsnames.ora. Typiquement ce fichier se présente comme ci-après :
# TNSNAMES.ORA Network Configuration File : D:\Oracle\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.

EXTPROC_CONNECTION_DATA.COMPANY.COM =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)
DBASPT.COMPANY.COM =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = yourpc)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = dbaspt)
)
)

# SQLNET.ORA Network Configuration File : D:\Oracle\network\admin\sqlnet.ora
# Generated by Oracle configuration tools.

NAMES.DEFAULT_DOMAIN = company.com
SQLNET.AUTHENTICATION_SERVICES = (NTS)
NAMES.DIRECTORY_PATH = (TNSNAMES, ONAMES, HOSTNAME)

Le deuxième paragraphe dans le fichier tnsnames.ora commence par DBASPT.COMPANY.COM. Si DBASPT.COMPANY.COM n’apparaît pas comme mentionné, Scott va recevoir l’erreur ORA-12154.
Si la première ligne avait seulement "DBASPT" (pas de nom de domaine par défaut), Scott va de nouveau recevoir la même erreur.
Au cas où la valeur de la variable NAMES.DEFAULT_DOMAIN n’existe pas et que le contenu du fichier tnsnames.ora reste inchangé, Scott va recevoir l’erreur ORA-12154 dans la mesure où Oracle recherche DBASPT et non DBASPT.COMPANY.COM.
Au cas où il n’existe pas de nom de domaine par défaut et que le fichier tnsnames.ora contient DBASPT.COMPANY.COM, Scott pourra se connecter à la base de données en utilisant le nom de service réseau pleinement qualifié. La chaîne de caractères représentée par NAMES.DEFAULT_DOMAIN concatené au SID est ce que l’on appelle le nom de service réseau pleinement qualifié. Scott pourra se connecter à la base de données en utilisant scott/tiger@dbaspt.company.com. Si Scott avait la valeur de NAMES.DEFAULT_DOMAIN positionné à internet.com, pourrait-il se connecter à la base de données à l’aider de scott/tiger@dbaspt.company.com ? La réponse est oui. Chaque fois que scott utilise une chaîne de nom de service avec un point (« . ») à l’intérieur, Oracle considère cette chaîne comme étant un nom de service réseau pleinement qualifié. Si un nom de service réseau pleinement qualifié est utilisé, Oracle contourne le fichier sqlnet.ora et va directement au fichier tnsnames.ora pour résoudre le nom de service.
Le fichier sqlnet.ora
Dans un environnement générique, on n’a même pas besoin d’utiliser le fichier sqlnet.ora. Pas d’exigence d’utiliser NAMES.DEFAULT_DOMAIN.
La variable NAMES.DIRECTORY_PATH montrée dans le fichier exemple reflète l’ordre par défaut d’utilisation des méthodes de résolution de noms. Aussi, si on utilise cet ordre par défaut, il n’y a pas besoin de le lister.
Dans la mesure où le fichier sqlnet.ora donné en exemple était basé sur un environnement Windows, Oracle a inclus le paramètre SQLNET.AUTHENTICATION_SERVICES et là encore même s’il n’est pas exigé.
Si vous utilisez une et une seule base de données et pas d’appels de procédure externe, tout ce dont vous pourriez avoir besoin dans le fichier tnsnames.ora est ceci :
DBASPT =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = yourpc)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = dbaspt)
)
)

Scott et les autres utilisateurs auront besoin uniquement d’utiliser nom_utilisateur/mot_de_passe@dbaspt pour se connecter à la base de données. L’entrée « SERVICE_NAME pourrait être changée en « SID » parce que l’utilisation de "SID=votre_nom_de_base" est encore supporté, mais le standard recommendé par Net8 et au-dessus est "SERVICE_NAME = votre_nom_de_base".

Comme pour beaucoup de choses sous Oracle, il y a plus d’une méthode pour accomplir ce que vous souhaitez accomplir. Et La configuration de Oracle Net n’est pas une exception. Hormis les pare-feux et autres outils sophistiqués de réseautage, Oracle fournit une méthode sécurisée de fixation des erreurs dans les fichiers de configuration d’Oracle net (et Net8). Cette méthode repose sur l’utilisation de l’assistant graphique et l’un des bénéfices d’utilisation de cet assistant est que vous obtiendrez exactement la même sortie si vous entrez la même information. N’ayez pas peur d’expérimenter ces fichiers dans une base de données de test. Vous n’endommagerez pas vos données et vous pourrez toujours recommencer.
Bon courage donc

1 Comments:

At 6:24 AM, Blogger Unknown said...

Merci pour cet article très intéressant qui permet de mettre les choses au clair pour des néophytes comme moi.

Enfin je comprends l'utilité du sqlnet.ora !!

Merci...

 

Post a Comment

<< Home