Pergunta

Pergunta da FaultFault, mas imaginei que tentaria aqui primeiro, já que tive sorte com as perguntas do Oracle no passado.

Estou tentando me conectar a um banco de dados Oracle do PHP e estou recebendo o seguinte erro.

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

Esse é o erro que o PHP relata e o erro que aparece no ouvinte do Oracle.

Meu problema imediato está corrigindo esse erro. A pergunta maior que eu gostaria de responder é como funciona o modelo de conexão Oracle?

Isso está em um ambiente de desenvolvimento em execução na minha máquina Windows local e está funcionando até agora. Infelizmente, o ambiente me foi entregue (eu não o configurei) e as pessoas que fez Configurado não está disponível para me ajudar a depurar.

Se eu estivesse recebendo um erro semelhante com o MySQL ou o PostgreSQL (dois sistemas com o qual estou mais familiarizado), verificaria para garantir que um processo de banco de dados estivesse em execução e, em seguida, tentasse me conectar manualmente ao banco de dados usando o nome de usuário/senha/ string de conexão. Infelizmente, não estou familiarizado com as ferramentas Oracle no Windows (exceto o desenvolvedor do SQL) e não sei o que um TNS: ouvinte ou SID estão no contexto do Oracle (eu tenho idéias vagas, mas idéias vagas raramente ajudam quando você está depurando algo assim)

Qualquer conselho geral seria apreciado.

Atualizações por comentários:

Há vários problemas no meu arquivo tnsnames.ora, sendo a entrada relevante

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

Isso não se reflete na lista de casos em que eu corro

    LSNRCTL> services

Então, acho que minha próxima pergunta é: como tento iniciar manualmente a instância do OBS2?

Foi útil?

Solução

Um nome do TNS é como um alias para sua instância de serviço. O serviço do ouvinte do TNS atua como uma espécie de serviço de pesquisa para você nesse sentido. Ele falhará com essa mensagem de erro se o serviço real para o qual você está tentando se conectar por meio de um nome do TNS não for válido.

Você pode testar se o ouvinte do TNS vê o serviço corretamente usando a ferramenta de linha de comando:

%>lsnrctl services

Que deve gerar algo como o seguinte:

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

Você pode postar a entrada do TNS relevante (no tnsnames.ora Arquivo)? Está localizado em Orahome Client ou DB Admin Network. Se você possui cliente e servidor, verifique se as duas cópias do tnsnames.ora O arquivo tem valores corretos, apenas para ser seguro.

Aqui está um exemplo de uma definição adequada de nome do TNS em tnsnames.ora chamado 'mydb':

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

Outras dicas

Só queria acrescentar isso, pois recentemente tive um problema de conexão semelhante que me deixou maluco até descobrir o que estava acontecendo.

Primeiro, as palavras -chave SID e Service_Name não são exatamente iguais. Esta foi minha primeira suposição errada. Em muitos ambientes, você pode trocar SID e Service_Name, mas nem sempre, depende.

Dito isto, seu erro dá o problema: você está especificando Sid em uma string de conexão em vez do NOME DO SERVIÇO que o TNSNames usa com sucesso.

Portanto, se você estiver especificando a string de conexão no seu código, tente usar o Service_Name Keyword na String Connect (*ou, se já você já está usando o Service_name e não pode conectar, tente usar a palavra -chave SID*).

Resposta excessivamente simplista, eu conheço, mas é fácil tentar salvar alguém com algumas dores de cabeça.

Espero que ajude.

A resposta de Mike Atlas é bastante abrangente, mas observe que você pode se conectar a 10g (ou posterior) DBS, que não possuem um TNSName publicado usando [//] host_name [: port] [/service_name

Hth

C.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top