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


226

Nous avons une application exécutée localement où nous rencontrons l'erreur suivante:

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

J'ai testé la connexion en utilisant TNSPingce qui s'est résolu correctement et j'ai essayé de me SQLPlusconnecter, 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:

  • l'écouteur TNS sur le serveur est en cours d'exécution.
  • Oracle lui-même sur le serveur est en cours d'exécution.

Nous ne connaissons aucun changement apporté à cet environnement. Autre chose que nous pouvons tester?


2
quelle est la commande TNSPing (avec params) que vous avez utilisée?
Grzegorz W

lorsque vous dites "s'exécuter localement", vous voulez dire que l'application se connecte à une base de données sur le même hôte? Quel est également le contenu de votre fichier sqlnet.ora? quelles versions sont signalées pour sqlplus et tnsping, et êtes-vous sûr qu'elles sont dans le même ORACLE_HOME?
David Aldridge

1
essayez de redémarrer la base de données. Puisqu'ils étaient censés informer l'auditeur de leur existence au démarrage, cela pourrait résoudre votre problème.
Jens Schauder

1
ALTER SYSTEM REGISTER est moins drastique que le redémarrage de la base de données.
DCookie

Réponses:


209

J'ai eu ce problème et le correctif consistait à s'assurer dans tnsnames.orale SERVICE_NAMEnom de service valide dans votre base de données. Pour trouver des 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 tnsnames.oraà jour :

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'auditeur vous dit essentiellement 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 de la station de travail client Win7 vers une base de données distante et blâmais les administrateurs de base de données;) *)


2
Sur win7,% ORACLE_HOME% \ NETWORK \ ADMIN \ tnsnames.ora
Brad Rippe

198
Comment suis-je censé interroger la base de données si je ne parviens même pas à me connecter?
isabelle martz

2
Pouvez-vous accéder directement au serveur DB et exécuter sqlplus à partir de là?
Brad Rippe

1
cela peut ne pas être le cas lorsque plusieurs clients / serveurs sont ou étaient installés sur la même machine. (tnsping affiche l'emplacement du répertoire qu'il utilise) - dans mon cas, listener.ora dans ce répertoire contenait des informations relatives à une ancienne instance de base de données que j'avais désinstallée - un moyen rapide et sale était de copier tout le contenu de listener.ora depuis mon installation actuelle d'Oracle Express, vers cet autre répertoire que l'auditeur semble vérifier (je pense que je l'ai changé via un registre ou quelque chose, et il a priorité sur ORACLE_HOME (?))
hello_earth

8
ORA-00942: la table ou la vue n'existe pas
Tommy Holman

44

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

L'erreur, si elle est examinée directement, indique que l'auditeur 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 de noms de service appariés dans un format que vous pouvez copier ou rechercher.

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


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

# 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 un 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))
    )
  )

3
Besoin de mettre à jour cette réponse avec la syntaxe de la façon dont listener.orales noms sont stockés. Je n'ai même pas de listener.oradossier. Je suis également sur un poste de travail client exécutant SQL Developer et essayant de créer simplement un lien de base de données lorsque j'obtiens l'erreur. Je n'ai pas de service d'écoute Oracle pour redémarrer.
vapcguy

vapcguy, vous devez être sur le serveur de base de données. on dirait que vous êtes sur le client
Joseph Argenio

Après avoir suivi les instructions de Sepideh concernant Net Manager, j'ai remarqué que mon fichier listeners.ora avait été mis à jour pour contenir une nouvelle entrée SID_LIST. J'ai modifié cette réponse pour inclure un exemple avant et après de la syntaxe, pour le bénéfice des lecteurs qui ne peuvent pas utiliser le Net Manager, pour une raison quelconque.
Kevin

12

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

allez dans Net Manager> Listener> sélectionnez les services de base de données sous le combox> "Global Database Name" doit être identique à "SID" et "Oracle Home Directory" 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 sidet l'oracle home.


12

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 cela en enregistrant les services. Exemple:

Mon descripteur en tnsnames.ora:

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

Donc, je procède à l'enregistrement du service listener.oramanuellement:

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

Enfin, redémarrez l'écouteur par commande:

> lsnrctl stop
> lsnrctl start

Terminé!


8

Le démarrage d'OracleServiceXXX à partir de services.msc a fonctionné pour moi dans Windows.


Dans Windows, si vous utilisez Oracle version 12.x, assurez-vous que le service OracleServiceORCL est en cours d'exécution. Si ce service n'est pas démarré, vous recevrez également le même code d'erreur.
faucon de rue

5

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 permis d'atteindre 90% du chemin. Dans mon cas, l'installation et la configuration des bases de données ont mis 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 se connecter en utilisant

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 d'Oracle, à l'origine:

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

Le nom du service de la requête était juste mydatabase plutôt que mydatabase.mydomain.com. J'ai édité le fichier tnsnames.ora avec juste le nom de base sans la partie domaine, donc ils ressemblaient à 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 stopet à lsnrctl startpartir d'une fenêtre de commande administrateur [ou Windows Powershell] au lieu du panneau de configuration Services, mais les deux fonctionnent.) Après cela, j'ai pu me connecter.


4

J'ai eu le même problème. Pour moi, juste écrire

sqlplus myusername/mypassword@localhost

a fait l'affaire, le faisant se connecte au nom de service par défaut, je suppose.


1
Nous avons rencontré un problème similaire avec notre chaîne de connexion à l'origine de cette erreur. Nous connectiez en utilisant le pilote JDBC d'Oracle mince avec la chaîne de connexion: jdbc:oracle:thin:@//localhost:1521/orcl. La chaîne de connexion corrigée pour éliminer cette erreur était: jdbc:oracle:thin:@localhost:1521.
dan

cela dépend si cela fonctionnerait - je pense que cette façon de se connecter, à en juger par ce que les autres ont dit, contourne complètement l'auditeur, en utilisant le nom d'hôte de l'ordinateur au lieu du SID - cette façon de se connecter provoque des problèmes chez les clients tiers, - je pense il ne fonctionne également que lorsque EZCONNECT est spécifié dans sqlnet.ora: NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)
hello_earth

3

ce qui a fonctionné pour moi était vraiment simple, j'avais juste besoin d'initier le service manuellement dans les "Services Windows" (services.msc dans cmd trompt). mon nom de service est: OracleServiceXXXXX.


Dans mon cas, bien que le type de démarrage soit défini sur Automatique, il ne démarre pas lorsque la machine démarre. Après avoir démarré manuellement le service "OracleServiceXE", il fonctionne pour Oracle Database 11g Express pour se connecter à la page Web DB et APEX (Oracle Application Express).
Ivan Chau

2

Vérifiez que la base de données est active. 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.


C'était exactement mon problème. Notre base de données est hébergée sur une machine virtuelle qui était en panne pendant que j'essayais d'utiliser un autre programme utilisant le DP. Après avoir vu ce fil, j'ai réalisé qu'il était probablement en panne.
Sh4d0wsPlyr

2

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. L'un des outils gratuits pour surveiller et confirmer cela 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 depuis le 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 vous voyez l'erreur ORA-12514, c'est une bonne indication que vous pouvez avoir un problème de pool de connexions).

entrez la description de l'image ici


2

J'ai résolu ce problème dans mon environnement Linux en mettant à jour l'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 IP correspond au fichier / etc / hosts:

$cat /etc/hosts

Modifiez votre fichier / etc / hosts, s'il est intégré:

$sudo gedit /etc/hosts

Au revoir.


2
c'est vieux, mais cela n'a pas beaucoup de sens d'ajouter votre IP à / etc / hosts. Il manque OP à SERVICE_NAME, d'autres choses sont assez indépendantes
Ostap

Je n'ai pas ajouté mon IP à / etc / host. Je viens de le corriger. Comme vous pouvez le voir dans cette rubrique, il existe de nombreuses réponses et variétés valides (avec vote positif) pour résoudre cette question. Si cette réponse ne vous a pas aidé, pourquoi voter contre? Cette réponse peut encore aider quelqu'un comme elle m'a aidé.
Sergio MC Figueiredo

2

Pour ceux qui peuvent exécuter Oracle dans une machine virtuelle (comme moi), j'ai vu ce problème parce que ma machine virtuelle manquait de mémoire, ce qui semble avoir empêché OracleDB de démarrer / fonctionner correctement. L'augmentation de la mémoire de ma machine virtuelle et le redémarrage ont résolu le problème.


2

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

Pour moi, l'erreur 12514 a été résolue après avoir spécifié le SERVICE_NAME correct. Vous trouvez cela sur le serveur dans le fichier tnsnames.oraqui contient 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, un mot de passe vous est demandé. 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 explicitement autoriser 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. En outre, cette DLL dépend de: OraOps11w.dll, oci.dll, oraociei11.dll (130 Mo!), Msvcr80.dll. Ces DLL doivent être dans le même répertoire que le fichier EXE ou vous devez indiquer le chemin de DLL dans: HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath. Sur les machines 64 bits, écrivez en plusHKLM\SOFTWARE\Wow6432Node\Oracle\...
  6. OPTION B: Si vous avez téléchargé ODAC12, vous avez besoin d'Oracle.DataAccess.dll, OraOps12w.dll, oci.dll, oraociei12.dll (160 Mo!), Oraons.dll, msvcr100.dll. Le chemin du Registre estHKEY_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 trouvezOracle.ManagedDataAccess.dll qui ne fait que 4 Mo et est une DLL gérée pure qui fonctionne dans des processus 32 bits et 64 bits ainsi et ne dépend d'aucune autre DLL et ne nécessite aucune entrée de registre.
  8. Le code C # suivant fonctionne pour moi sans aucune configuration côté serveur (juste l'installation par défaut):
using Oracle.DataAccess.Client;
ou
using Oracle.ManagedDataAccess.Client;

....

chaîne oradb = "Source de données = (DESCRIPTION ="
    + "(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP) (HOST = 192.168.1.158) (PORT = 1521)))" "
    + "(CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE)));"
    + "ID utilisateur = SYSTÈME; Mot de passe = xxx;";

utilisant (OracleConnection conn = new OracleConnection (oradb)) 
{
    conn.Open ();
    en utilisant (OracleCommand cmd = new OracleCommand ())
    {
        cmd.Connection = conn;
        cmd.CommandText = "sélectionnez TABLESPACE_NAME dans DBA_DATA_FILES";

        utilisant (OracleDataReader dr = cmd.ExecuteReader ())
        {
            while (dr.Read ())
            {
                listBox.Items.Add (dr ["TABLESPACE_NAME"]);
            }
        }
    }
}

Si le SERVICE_NAME=XEproblème est incorrect, vous obtenez l'erreur 12514. Le SERVICE_NAMEest facultatif. Vous pouvez également le laisser de côté.


Merci beaucoup, à partir de votre solution, j'ai trouvé l'astuce, dans mon cas, c'était l'antivirus qui bloquait le programme, donc n'a pas pu obtenir une connexion à la base de données Oracle.
robot_alien

2

J'avais également fait face au même problème et j'ai passé 3 jours à le creuser.

Cela se produit en raison de votre mauvaise entrée de service TNS.

Vérifiez d'abord si vous pouvez vous connecter à la base de données de secours à partir de la base de données principale à l'aide de sql> sqlplus sys@orastand as sysdba( orastandest une base de données de secours).

Si vous ne parvenez pas à vous connecter, c'est un problème avec le service. Corrigez l'entrée du nom du service dans le fichier TNS à l'extrémité principale.

Vérifiez la base de données de secours de la même manière. Effectuez également les modifications ici si nécessaire.

Assurez-vous que le log_archive_dest_2paramètre a le nom de service correct.


1

J'ai eu la même erreur car 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 * dans global_name;

et j'ai trouvé mon SID distant ("XE").

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


0

Dans mon cas, la base de données a manqué d'espace disque. Ce qui l'a fait ne pas répondre. Une fois que j'ai résolu ce problème, tout a de nouveau fonctionné.


Comment puis-je le savoir?
CodeSlave

0

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


0

Le redémarrage de la machine virtuelle a fonctionné pour moi


0

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


0

tnslsnr est en place mais la base de données est en panne.

Pour oracle novice, il n'est pas évident que la base de données soit en panne pendant que les connexions sont acceptées.

J'ai dû démarrer la base de données manuellement comme ça

su - oracle
export ORACLE_SID=XE
sqlplus sys as sysdba

Et puis dans la console SQL

startup

Dans mon cas, j'ai échoué au démarrage, mais j'ai reçu un autre message d'erreur et j'ai trouvé la source d'un problème - j'ai dû changer le nom d'hôte, puis le démarrage automatique de la base de données était à nouveau fonctionnel.


0

J'ai implémenté la solution de contournement ci-dessous pour résoudre ce problème.

  1. J'ai défini le ORACLE_HOME à l'aide de l'invite de commande (cliquez avec le bouton droit sur cmd.exe et exécutez en tant qu'administrateur système).

  2. Utilisé ci-dessous la commande

    set oracle_home="path to the oracle home"

  3. Accédez à Tous les programmes -> Oracle -ora home1 -> Outils de migration de configuration -> Net Manager -> Listener

  4. Sélectionnez Services de base de données dans la liste déroulante. Le nom de la base de données globale et le SID sont définis sur le même (ORCL dans mon cas). Définissez Oracle Home Directory.

Exemple de fenêtre Oracle Net Manager de la documentation Oracle: Exemple d'Oracle Net Manager

  1. Cliquez sur Fichier et enregistrez la configuration réseau.

0

Le problème était que mon URL de chaîne de connexion contenait le nom de la base de données au lieu du SID. Remplacement du nom de la base de données par la connexion à la base de données Oracle SID a résolu ce problème.

Pour connaître les SID de votre oracle, vous pouvez parcourir le tnsnames.orafichier.

XE était le SID réel, voici à quoi ressemble ma chaîne de connexion tomcat maintenant:

    <Resource
       name="jdbc/my_db_conn"
       auth="Container"
       type="javax.sql.DataSource"
       driverClassName="oracle.jdbc.driver.OracleDriver"
       url="jdbc:oracle:thin:@//127.0.0.1:1521/XE"
       username="test_user"
       password="test" />

Ma version de serveur était "Oracle 11.2 Express", mais la solution devrait également fonctionner sur d'autres versions.


0

Dans mon cas, des crochets autour du SERVICE_NAME manquaient dans le fichier tnsnames.ora .

<DBNAME> =
  (DESCRIPTION =
    (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL=TCP)(HOST = nupark-cnvr-ora )(PORT=1521))
    )
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = <DBNAME> ***CLOSING ROUND BRACKET WAS MISSING HERE***
    )
  )

LISTENER_<DBNAME> =

  (ADDRESS = (PROTOCOL = TCP)(HOST = nupark-cnvr-ora)(PORT = 1521))

0

Pour ceux qui utilisent Spring-Boot et jdbc pour la connexion. Vous devez être prudent lors de l'écriture de jdbcUrl dans application.properties

Avec SID dans la connexion à la base de données - source.datasource.jdbcUrl = jdbc:oracle:thin:@[HOST][:PORT]:SID

Avec le nom du service dans la connexion db globe.datasource.jdbcUrl = jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE

Cela a fonctionné pour moi :)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.