Question

Borderline ServerFault question, mais pensé que je vais essayer d'abord ici depuis que j'ai eu la chance avec des questions Oracle dans le passé.

Je suis en train de se connecter à une base de données Oracle de PHP, et je reçois l'erreur suivante.

ORA-12505: TNS:listener does not currently know of SID given in connect descriptor

Ceci est l'erreur que les rapports PHP, et l'erreur qui apparaît dans la listener.log Oracle.

Mon problème immédiat est la fixation de cette erreur. La grande question que je voudrais répondre est comment fonctionne le modèle de connexion Oracle?

Ceci est un environnement de développement qui est en cours d'exécution sur ma machine Windows locales et travaille jusqu'à présent. Malheureusement, l'environnement m'a été remis (je ne mets pas en place) et les gens qui a mis en place ne sont pas disponibles pour me aider à déboguer.

Si je recevais une erreur similaire avec MySQL ou PostgreSQL (deux systèmes, je suis plus familier avec), je vérifierons qu'un processus de base de données a été en cours d'exécution, et puis essayez de vous connecter manuellement à la base de données en utilisant le nom d'utilisateur / mot de passe / chaîne de connexion. Malheureusement, je ne suis pas familier avec les outils Oracle sur les fenêtres (autres que SQL Developer) et je ne sais pas ce qu'est un TNS: l'auditeur ou le SID sont dans le contexte d'Oracle (j'ai des idées vagues, mais des idées vagues aider rarement quand vous déboguez quelque chose comme ça)

Un conseil général serait apprécié.

Mises à jour par les commentaires:

Il y a un certain nombre de entires dans mon fichier tnsnames.ora, l'entrée correspondante étant

OBS2 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = steel-ae39650)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = OBS2)
    )
  )

Ce ne figure pas dans la liste des instances lorsque je lance

    LSNRCTL> services

Je pense que ma prochaine question est, comment puis-je essayé de démarrer manuellement l'instance OBS2?

Était-ce utile?

La solution

Un nom TNS est comme un alias à votre instance de service. Le service d'écoute TNS agit comme une sorte de service de recherche pour vous à cet égard. Il échouera avec ce message d'erreur si le service réel que vous essayez de vous connecter via un nom TNS est pas valide.

Vous pouvez ensuite tester pour voir si l'auditeur TNS voit le service correctement en utilisant l'outil de ligne de commande:

%>lsnrctl services

Ce qui devrait quelque chose de sortie comme suit:

Service "myservice" has 1 instance(s).
  Instance "myinstance", status READY, has 1 handler(s) for this service...
    Handler(s):
      "D000" established:0 refused:0 current:0 max:1002 state:ready
         DISPATCHER <machine: LOCALHOST, pid: 12345>
         (ADDRESS=(PROTOCOL=tcp)(HOST=LOCALHOST)(PORT=6789))

Pouvez-vous s'il vous plaît poster l'entrée TNS concerné (dans le fichier tnsnames.ora)? Il est situé dans OraHome \ client ou db \ ADMIN \ RESEAU. Si vous avez à la fois client et serveur, assurez-vous que les deux copies du fichier tnsnames.ora ont des valeurs correctes, juste pour être sûr.

Voici un exemple d'une définition de nom propre TNS dans tnsnames.ora appelé « mydb »:

myDbAlias =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 12345)(QUEUESIZE = 100))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = myservice)
    )
  )

Autres conseils

Je voulais juste ajouter à cela, comme je l'ai récemment un problème de connexion similaire qui m'a conduit noix jusqu'à ce que je compris ce qui se passait.

D'abord, le SID et SERVICE_NAME mots-clés ne sont pas exactement les mêmes. Ce fut ma première hypothèse erronée. Dans de nombreux environnements, vous pouvez échanger des SID et SERVICE_NAME, mais pas toujours, cela dépend.

Cela dit, votre erreur donne suite le problème: vous spécifiez SID dans une chaîne de connexion au lieu de SERVICE_NAME TNSNAMES utilise avec succès

.

Donc, si vous spécifiez la chaîne de connexion dans votre code, essayez d'utiliser mot-clé SERVICE_NAME dans la chaîne de connexion (* ou, si vous avez déjà en utilisant SERVICE_NAME et ne peut pas se connecter, essayez d'utiliser mot-clé SID *).

trop simpliste réponse que je sais, mais facile d'essayer et peut sauver quelqu'un des maux de tête.

L'espoir qui aide.

La réponse Mike Atlas est assez complet, mais notez que vous pouvez vous connecter à 10g (ou version ultérieure) qui ne BDs pas de tnsname publiée à l'aide [//] nom_hôte [: port] [/ nom_service]

HTH

C.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top