web-dev-qa-db-fra.com

ORA-12514 TNS: l'auditeur ne connaît pas actuellement le service demandé dans le descripteur de connexion

Nous avons une application en cours d'exécution localement où nous rencontrons l'erreur suivante:

ORA-12514: TNS: l'auditeur ne connaît pas actuellement le service demandé dans le descripteur de connexion

J'ai testé la connexion en utilisant TNSPing qui a été correctement résolue et j'ai essayé SQLPlus d'essayer de vous connecter, ce qui a échoué avec la même erreur que ci-dessus. J'ai utilisé cette syntaxe pour SQLPlus:

sqlplus username/password@addressname[or Host name]

Nous avons vérifié que:

  • tNS Listener sur le serveur est en cours d'exécution.
  • Oracle lui-même sur le serveur est en cours d'exécution.

Nous ne sommes au courant d'aucune modification apportée à cet environnement. Quelque chose d'autre que nous pouvons tester?

196
Jacques

J'ai eu ce problème et le correctif était de m'assurer que dans tnsnames.ora le SERVICE_NAME est un nom de service valide dans votre base de données. Pour connaître les noms de service valides, vous pouvez utiliser la requête suivante dans Oracle:

select value from v$parameter where name='service_names'

Une fois que j'ai mis à jour tnsnames.ora pour:

TEST =
   (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(Host = *<validhost>*)(PORT = *<validport>*))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = *<servicenamefromDB>*)
    )
)

alors j'ai couru:

sqlplus user@TEST

Succès! L'écouteur vous dit en gros que le nom de service que vous utilisez n'est pas un service valide selon la base de données.

(* J'exécutais sqlplus à partir du poste de travail client Win7 vers une base de données distante et blâme les DBA;) *)

186
Brad Rippe

Je sais que c'est une vieille question, mais toujours sans réponse. Il m'a fallu une journée de recherche, mais j'ai trouvé la solution la plus simple, du moins dans mon cas (Oracle 11.2 sur Windows 2008 R2) et je souhaitais la partager.

Si l'erreur est examinée directement, l'erreur indique que le programme d'écoute ne reconnaît pas le nom du service. Mais où conserve-t-il les noms de service? Dans %Oracle_HOME%\NETWORK\ADMIN\listener.ora

Le "SID_LIST" est juste cela, une liste de SID et noms de services appariés dans un format que vous pouvez copier ou rechercher.

J'ai ajouté le nom du service qui pose problème, puis, dans le panneau de configuration Windows "Services", j'ai procédé à un "redémarrage" sur le service d'écoute Oracle. Maintenant tout va bien.


Par exemple, votre fichier listener.ora peut initialement ressembler à ceci:

# listener.ora Network Configuration File: C:\app\Oracle_user\product\12.1.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (Oracle_HOME = C:\app\Oracle_user\product\12.1.0\dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:C:\app\Oracle_user\product\12.1.0\dbhome_1\bin\oraclr12.dll")
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(Host = localhost)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

... Et pour lui faire reconnaître le nom de service orcl, vous pouvez le changer en:

# listener.ora Network Configuration File: C:\app\Oracle_user\product\12.1.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (Oracle_HOME = C:\app\Oracle_user\product\12.1.0\dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:C:\app\Oracle_user\product\12.1.0\dbhome_1\bin\oraclr12.dll")
    )
    (SID_DESC = 
        (GLOBAL_DBNAME = orcl)
        (Oracle_HOME = C:\app\Oracle_user\product\12.1.0\dbhome_1)
        (SID_NAME = orcl)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(Host = localhost)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )
35
Joseph Argenio

J'ai eu ce problème à Windows Server 2008 R2 et Oracle 11g

sélectionnez Gestionnaire de réseau> Listener> sélectionnez les services de base de données dans la liste déroulante> "Nom de la base de données globale" doit être identique à "SID" et "Répertoire de base Oracle" doit être correct.

Si vous ne disposez d'aucune entrée pour les services de base de données, créez-en une et définissez la base de données globale correcte, sid et Oracle home.

12
Sepideh

Dans mes circonstances, l'erreur était due au fait que l'auditeur n'avait pas enregistré le service de la base de données. J'ai résolu ce problème en enregistrant les services. Exemple:

Mon descripteur dans tnsnames.ora:

LOCALDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(Host = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = LOCALDB)
    )
  )

Je vais donc enregistrer le service manuellement dans le listener.ora:

SID_LIST_LISTENER =
    (SID_DESC =
      (GLOBAL_DBNAME = LOCALDB)
      (Oracle_HOME = C:\Oracle\product\11.2.0\dbhome_1)
      (SID_NAME = LOCALDB)
    )

Enfin, redémarrez le listener avec la commande:

> lsnrctl stop
> lsnrctl start

Terminé!

8
manix

Démarrer OracleServiceXXX à partir de services.msc a fonctionné pour moi sous Windows.

7
Ishildur Baggins

Cela devrait vraiment être un commentaire à la réponse de Brad Rippe , mais hélas, pas assez de représentants. Cette réponse m'a fourni 90% du chemin. Dans mon cas, l'installation et la configuration des bases de données ajoutent des entrées dans le fichier tnsnames.ora pour les bases de données que j'exécutais. Tout d'abord, j'ai pu me connecter à la base de données en définissant les variables d'environnement (Windows):

set Oracle_SID=mydatabase
set Oracle_HOME=C:\Oracle\product\11.2.0\dbhome_1

puis en utilisant une connexion

sqlplus / as sysdba

Ensuite, exécutez la commande à partir de la réponse de Brad Rippe:

select value from v$parameter where name='service_names';

a montré que les noms ne correspondaient pas exactement. Les entrées telles que créées à l'aide de l'assistant de configuration de base de données Oracle étaient à l'origine:

MYDATABASE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(Host = mylaptop.mydomain.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = mydatabase.mydomain.com)
    )
  ) 

Le nom de service de la requête était simplement mydatabase plutôt que mydatabase.mydomain.com. J'ai modifié le fichier tnsnames.ora uniquement pour le nom de base sans la partie domaine afin qu'il ressemble à ceci:

MYDATABASE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(Host = mylaptop.mydomain.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = mydatabase)
    )
  ) 

J'ai redémarré le service TNS Listener (j'utilise souvent lsnrctl stop et lsnrctl start à partir d'une fenêtre de commande d'administrateur [ou de Windows Powershell] au lieu du panneau de configuration Services, mais les deux fonctionnent.) Après cela, j'ai pu relier.

4
Capricorn1

ce qui a fonctionné pour moi était très simple, je devais simplement lancer le service manuellement dans les "Services Windows" (services.msc dans cmd trompt). mon nom de service est: OracleServiceXXXXX.

2
isabelle martz

j'avais également rencontré le même problème et passé 3 jours à le creuser. Cela se produit à cause de votre mauvaise entrée de service TNS. Commencez par vérifier si vous êtes en mesure de vous connecter à la base de données en attente depuis la base de données principale à l’aide de sql> sqlplus sys @ orastand en tant que sysdba (orastand est une base de données en attente). Si vous ne pouvez pas vous connecter, le problème est lié au service. Corrigez l'entrée du nom de service dans le fichier TNS à l'extrémité principale. Vérifiez de la même manière dans la base de données en attente, si nécessaire, apportez les modifications ici aussi. et Assurez-vous que le paramètre log_archive_dest_2 a le nom de service correct.

2
user3778101

J'ai eu le même problème, pour moi juste d'écrire

sqlplus myusername/mypassword@localhost

fait le tour, ce faisant, il se connecte au nom de service par défaut je suppose.

2
Breeze

Cette erreur peut se produire lorsqu'une application établit une nouvelle connexion pour chaque interaction de base de données ou que les connexions ne sont pas fermées correctement. Un des outils gratuits permettant de surveiller et de confirmer ceci est le développeur Oracle Sql (bien que ce ne soit pas le seul outil que vous pouvez utiliser pour surveiller les sessions de base de données).

vous pouvez télécharger l'outil à partir du site Oracle Sql Developer

voici une capture d'écran de la façon de surveiller vos sessions. (Si vous voyez de nombreuses sessions s'accumuler pour votre utilisateur d'application lorsque l'erreur ORA-12514 est détectée, c'est une bonne indication que vous pouvez avoir un problème de pool de connexions).

enter image description here

2
grepit

J'ai résolu ce problème dans mon environnement linux en mettant à jour l'adresse IP de ma machine dans le fichier/etc/hosts.

Vous pouvez vérifier votre IP réseau (inet end.) Avec:

$ifconfig

Vérifiez si votre adresse IP correspond au fichier/etc/hosts:

$cat /etc/hosts

Editez votre fichier/etc/hosts, si incorporé:

$Sudo gedit /etc/hosts

Au revoir.

2

Pour ceux qui exécutent Oracle dans un VM (comme moi), j'ai constaté ce problème car mon VM manquait de mémoire, ce qui semble avoir empêché OracleDB de démarrer/s'exécuter. correctement. L'augmentation de ma mémoire VM et le redémarrage ont résolu le problème.

2
th3uiguy

Beaucoup de réponses ici, mais voici un exemple de travail avec du code que vous pouvez copier et coller et tester immédiatement:

Pour moi, l'erreur 12514 a été résolue après avoir spécifié le bon SERVICE_NAME. Vous trouvez cela sur le serveur dans le fichier tnsnames.ora qui vient avec 3 noms de service prédéfinis (l’un d’eux est "XE").

  1. J'ai installé la base de données Oracle Express OracleXE112 qui est déjà livrée avec des tables de démonstration préinstallées.
  2. Lorsque vous démarrez le programme d'installation, il vous est demandé un mot de passe. J'ai entré "xxx" comme mot de passe. (non utilisé dans la production)
  3. Mon serveur fonctionne sur la machine 192.168.1.158
  4. Sur le serveur, vous devez autoriser explicitement l'accès au processus TNSLSNR.exe dans le pare-feu Windows. Ce processus écoute sur le port 1521.
  5. OPTION A: Pour C # (.NET2 ou .NET4), vous pouvez télécharger ODAC11, à partir duquel vous devez ajouter Oracle.DataAccess.dll à votre projet. De plus, cette DLL dépend de: OraOps11w.dll, oci.dll, oraociei11.dll (130 Mo!), Msvcr80.dll. Ces DLL doivent figurer dans le même répertoire que le fichier EXE ou vous devez spécifier le chemin DLL dans: HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath. Sur les machines 64 bits, écrivez en plus sur HKLM\SOFTWARE\Wow6432Node\Oracle\...
  6. OPTION B: Si vous avez téléchargé ODAC12 vous avez besoin de Oracle.DataAccess.dll, OraOps12w.dll, oci.dll, oraociei12.dll (160 Mo!), Oraons.dll, msvcr100.dll. Le chemin du registre est HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
  7. OPTION C: Si vous ne voulez pas d'énormes DLL de plus de 100 Mo, vous devez télécharger ODP.NET_Managed12.xxxxxxxx.Zip dans lequel vous trouvez Oracle.ManagedDataAccess.dll qui ne contient que 4 Mo. une pure DLL gérée qui fonctionne également dans les processus 32 bits et 64 bits et ne dépend d'aucun autre DLL et ne nécessite aucune entrée de registre.
  8. Le code C # suivant fonctionne pour moi sans configuration du côté serveur (uniquement l'installation par défaut):
 utilisant Oracle.DataAccess.Client; 
 ou 
 utilisant Oracle.ManagedDataAccess.Client; 
 
 .... 
 
 string oradb = "Source de données = (DESCRIPTION =" 
 + "(ADDRESS_LIST = (ADDRESS =), (PROTOCOL = TCP) (Host = 192.168.1.158) (PORT = 1521)))" ". ____.] + "(CONNECT_DATA = (SERVEUR = DÉDIÉ) (SERVICE_NAME = XE)));" 
 + "ID utilisateur = SYSTÈME; Mot de passe = xxx;"; 
 
 using (OracleConnection conn = new OracleConnection (oradb)) 
 {
 conn.Open (); 
 à l'aide de (OracleCommand cmd = new OracleCommand ().) 
 {
 cmd.Connection = conn; 
 cmd.CommandText = "sélectionnez TABLESPACE_NAME à partir de DBA_DATA_FILES"; 
 
 en utilisant (OracleDataReader dr = cmd.ExecuteReader ()) 
 {
 while (dr.Read ()) 
 {
 listBox.Items.Add (dr ["TABLESPACE_NAME"]); 
} 
} 
} 
}

Si le SERVICE_NAME=XE est erroné, vous obtenez l'erreur 12514. Le SERVICE_NAME est facultatif. Vous pouvez également le laisser de côté.

2
Elmue

Vérifiez pour voir la base de données est en place. Connectez-vous au serveur, définissez la variable d’environnement Oracle_SID sur votre SID de base de données et exécutez SQL * Plus en tant que connexion locale.

2
DCookie

J'ai eu la même erreur parce que le SID distant spécifié était incorrect:

 > sqlplus $DATASOURCE_USERNAME/$DATASOURCE_PASSWORD@$DB_SERVER_URL/$REMOTE_SID 

J'ai interrogé la base de données système:

sélectionnez * parmi nom_global;

et a trouvé mon SID distant ("XE").

Ensuite, je pourrais me connecter sans aucun problème.

1
Laura Liparulo

Dans mon cas, la base de données était à court d'espace disque. Ce qui l'a fait ne pas répondre. Une fois que j'ai éclairci cette question, tout a encore fonctionné.

1
Pete Brumm

Mon problème a été résolu en remplaçant l'URL 'ID' dans l'URL par 'nom du service' et l'hôte correct.

0
Sir. Hedgehog

Pour moi, cela a été causé par l'utilisation d'une adresse IP dynamique utilisant l'installation. J'ai installé Oracle en utilisant une adresse IP statique, puis tout allait bien

0
Steef

Le redémarrage de la VM a fonctionné pour moi

0
wishman