ORA-12514 TNS: o ouvinte atualmente não conhece o serviço solicitado no descritor de conexão

226

Temos um aplicativo em execução localmente, onde estamos enfrentando o seguinte erro:

ORA-12514: TNS: o ouvinte atualmente não conhece o serviço solicitado no descritor de conexão

Testei a conexão usando o TNSPingque foi resolvido corretamente e tentei SQLPlusconectar, que falhou com o mesmo erro acima. Eu usei esta sintaxe para SQLPlus:

sqlplus username/password@addressname[or host name]

Verificamos que:

  • o TNS Listener no servidor está em execução.
  • O próprio Oracle no servidor está em execução.

Não conhecemos nenhuma alteração feita nesse ambiente. Mais alguma coisa que possamos testar?

Jacques
fonte
2
o que é o comando TNSPing (com parâmetros) que você usou?
Grzegorz W
quando você diz "executando localmente", quer dizer que o aplicativo está se conectando a um banco de dados no mesmo host? Além disso, qual é o conteúdo do seu arquivo sqlnet.ora? quais versões são relatadas para sqlplus e tnsping e tem certeza de que elas estão no mesmo ORACLE_HOME?
David Aldridge 28/05
1
tente reiniciar o banco de dados. Como eles deveriam informar o Ouvinte sobre sua existência na inicialização, isso pode resolver o seu problema.
Jens Schauder
1
ALTER SYSTEM REGISTER é menos drástico do que reiniciar o banco de dados.
DCookie

Respostas:

209

Eu tive esse problema e a correção foi para se certificar de tnsnames.orao SERVICE_NAMEé um nome de serviço válido no banco de dados. Para descobrir nomes de serviço válidos, você pode usar a seguinte consulta no oracle:

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

Depois que eu atualizei tnsnames.orapara:

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

então eu corri:

sqlplus user@TEST

Sucesso! O ouvinte está basicamente dizendo que qualquer nome de serviço que você esteja usando não é um serviço válido, de acordo com o banco de dados.

(* Eu estava executando o sqlplus da estação de trabalho do cliente Win7 no banco de dados remoto e culpe os DBAs;) *)

Brad Rippe
fonte
2
No win7,% ORACLE_HOME% \ NETWORK \ ADMIN \ tnsnames.ora
Brad Rippe 8/14
198
Como devo consultar o banco de dados se eu não consigo me conectar a ele?
Isabelle martz
2
Você pode ssh no servidor DB diretamente e executar o sqlplus a partir daí?
Brad Rippe
1
esse pode não ser o caso quando vários clientes / servidores são ou costumavam ser instalados na mesma máquina. (tnsping gera o local do diretório que ele usa) - no meu caso, o listener.ora nesse diretório continha informações referentes a uma instância antiga do banco de dados que eu havia desinstalado - a maneira rápida e suja era copiar todo o conteúdo do listener.ora meu atual instalação do Oracle Express, para que outro diretório que ouvinte parece estar verificando (eu acho que mudou através de um registo ou algo assim, e tem precedência sobre ORACLE_HOME ()?)
hello_earth
8
ORA-00942: tabela ou exibição não existe
Tommy Holman
44

Eu sei que essa é uma pergunta antiga, mas ainda sem resposta. Levei um dia de pesquisa, mas encontrei a solução mais simples, pelo menos no meu caso (Oracle 11.2 no Windows 2008 R2) e queria compartilhar.

O erro, se analisado diretamente, indica que o ouvinte não reconhece o nome do serviço. Mas onde ele mantém os nomes dos serviços? No%ORACLE_HOME%\NETWORK\ADMIN\listener.ora

O "SID_LIST" é apenas isso, uma lista de SIDs e nomes de serviço emparelhados em um formato que você pode copiar ou procurar.

Adicionei o problema Nome do serviço e, no painel de controle "Serviços" do Windows, fiz um "Reiniciar" no serviço de ouvinte do Oracle. Agora está tudo bem.


Por exemplo, seu arquivo listener.ora pode inicialmente parecer com:

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

... E para fazer com que ele reconheça um nome de serviço orcl, você pode alterá-lo para:

# 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))
    )
  )
Joseph Argenio
fonte
3
Precisa atualizar esta resposta com a sintaxe de como listener.oraarmazena os nomes. Eu nem tenho um listener.oraarquivo. Também estou em uma estação de trabalho cliente executando o SQL Developer e tentando apenas criar um link de banco de dados quando recebo o erro. Não tenho um serviço do Oracle Listener para reiniciar.
precisa saber é o seguinte
vapcguy, você precisa estar no servidor de banco de dados. parece que você está no cliente
Joseph Argenio
Após seguir as instruções do Sepideh envolvendo o Net Manager, notei que meu arquivo listeners.ora havia sido atualizado para conter uma nova entrada SID_LIST. Editei esta resposta para incluir um exemplo de sintaxe antes e depois, para o benefício de leitores que não podem usar o Net Manager, por qualquer motivo.
Kevin
12

Eu tive esse problema no Windows Server 2008 R2 e Oracle 11g

vá para Net Manager> Ouvinte> selecione serviços de banco de dados do combox> "Nome do banco de dados global" deve ser o mesmo que "SID" e "Oracle Home Directory" deve estar correto.

Se você não tiver nenhuma entrada para serviços de banco de dados, crie uma e defina o banco de dados global correto side o oracle home.

Sepideh
fonte
12

Nas minhas circunstâncias, o erro ocorreu devido ao fato de o ouvinte não ter o serviço do banco de dados registrado. Resolvi isso registrando os serviços. Exemplo:

Meu descritor em tnsnames.ora:

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

Portanto, procuro registrar o serviço listener.oramanualmente:

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

Por fim, reinicie o ouvinte por comando:

> lsnrctl stop
> lsnrctl start

Feito!

manix
fonte
8

Iniciar o OracleServiceXXX a partir do services.msc funcionou para mim no Windows.

Ishildur Baggins
fonte
No Windows, se você estiver usando o Oracle Release 12.x, verifique se o serviço OracleServiceORCL está em execução. Se este serviço não for iniciado, você também receberá o mesmo código de erro.
street hawk
5

Isso realmente deve ser um comentário à resposta de Brad Rippe , mas infelizmente, não é o suficiente. Essa resposta me levou 90% do caminho até lá. No meu caso, a instalação e a configuração dos bancos de dados colocam entradas no arquivo tnsnames.ora para os bancos de dados que eu estava executando. Primeiro, consegui me conectar ao banco de dados definindo as variáveis ​​de ambiente (Windows):

set ORACLE_SID=mydatabase
set ORACLE_HOME=C:\Oracle\product\11.2.0\dbhome_1

e depois conectar usando

sqlplus / as sysdba

Em seguida, executando o comando da resposta de Brad Rippe:

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

mostrou que os nomes não correspondiam exatamente. As entradas criadas usando o Assistente de Configuração de Banco de Dados da Oracle onde originalmente:

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

O nome do serviço da consulta era apenas um mydatabasepouco mydatabase.mydomain.com. Eu editei o arquivo tnsnames.ora apenas para o nome base, sem a parte do domínio, para que parecessem assim:

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

Eu reiniciado o serviço TNS Listener (muitas vezes eu uso lsnrctl stope lsnrctl startde uma janela de comando do administrador [ou o Windows PowerShell] em vez do painel de controle Serviços, mas ambos trabalham.) Depois disso, eu era capaz de se conectar.

Capricórnio1
fonte
4

Eu tive o mesmo problema. Para mim, apenas escrevendo

sqlplus myusername/mypassword@localhost

fiz o truque, isso faz com que ele se conecte ao nome do serviço padrão, eu acho.

Rika
fonte
1
Tivemos um problema semelhante com nossa cadeia de conexão, causando esse erro. Nós estavam se conectando usando o driver thin JDBC da Oracle com a seqüência de conexão: jdbc:oracle:thin:@//localhost:1521/orcl. A seqüência de conexão corrigida para eliminar esse erro foi: jdbc:oracle:thin:@localhost:1521.
dan
depende se isso funcionaria - eu acho que essa maneira de conectar, julgando o que os outros disseram, está ignorando o ouvinte completamente, usando o nome do host do computador em vez do SID - essa maneira de conectar causa problemas em clientes de terceiros, - eu acho ele também funciona apenas quando o EZCONNECT é especificado no sqlnet.ora: NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)
hello_earth
3

o que funcionou para mim foi realmente simples, eu só precisava iniciar o serviço manualmente no "Windows Services" (services.msc no cmd trompt). meu nome de serviço é: OracleServiceXXXXX.

isabelle martz
fonte
No meu caso, embora o Tipo de inicialização esteja definido como Automático, ele não inicia quando a máquina é inicializada. Depois de iniciar manualmente o serviço "OracleServiceXE", ele funciona para o Oracle Database 11g Express se conectar à página DB e APEX (Oracle Application Express).
Ivan Chau
2

Verifique se o banco de dados está ativo. Efetue logon no servidor, defina a variável de ambiente ORACLE_SID como o SID do banco de dados e execute o SQL * Plus como uma conexão local.

DCookie
fonte
Este foi exatamente o meu problema. Nosso banco de dados está hospedado em uma VM que estava inativa enquanto eu tentava usar outro programa que usava o DP. Depois de ver este tópico, percebi que provavelmente estava fora do ar.
Sh4d0wsPlyr
2

Este erro pode ocorrer quando um aplicativo faz uma nova conexão para cada interação com o banco de dados ou as conexões não são fechadas corretamente. Uma das ferramentas gratuitas para monitorar e confirmar isso é o desenvolvedor do Oracle Sql (embora essa não seja a única ferramenta que você pode usar para monitorar sessões de banco de dados).

você pode baixar a ferramenta no site da Oracle Sql Developer

Aqui está uma captura de tela de como monitorar suas sessões. (se houver muitas sessões acumuladas para o usuário do aplicativo durante o erro ORA-12514, é uma boa indicação de que você pode ter um problema no conjunto de conexões).

insira a descrição da imagem aqui

grepit
fonte
2

Resolvi esse problema no meu ambiente Linux atualizando o IP da minha máquina no arquivo / etc / hosts.

Você pode verificar o IP da sua rede (inet end.) Com:

$ifconfig

Veja se o seu IP corresponde ao arquivo / etc / hosts:

$cat /etc/hosts

Edite seu arquivo / etc / hosts, se estiver incorporado:

$sudo gedit /etc/hosts

Tchau.

Sergio MC Figueiredo
fonte
2
isso é antigo, mas não faz muito sentido adicionar seu IP ao / etc / hosts. O OP está ausente no SERVICE_NAME, outras coisas não estão relacionadas
Ostap
Eu não adicionei meu IP ao / etc / host. Eu apenas corrigi. Como você pode ver neste tópico, existem muitas respostas e variedades válidas (com voto positivo) para resolver esta questão. Se essa resposta não ajudou, por que reduzir o voto? Essa resposta ainda pode ajudar alguém, pois me ajudou.
Sergio MC Figueiredo
2

Para aqueles que podem estar executando o Oracle em uma VM (como eu), vi esse problema porque minha VM estava ficando sem memória, o que parece ter impedido o OracleDB de iniciar / executar corretamente. Aumentar a memória da VM e reiniciar corrigiu o problema.

th3uiguy
fonte
2

Muitas respostas aqui, mas aqui vem um exemplo de trabalho com código que você pode copiar, colar e testar imediatamente:

Para mim, o erro 12514 foi resolvido após a especificação do SERVICE_NAME correto. Você encontra isso no servidor no arquivo tnsnames.oraque vem com 3 nomes de serviço predefinidos (um deles é "XE").

  1. Instalei o banco de dados Oracle Express OracleXE112, que já vem com algumas tabelas de demonstração pré-instaladas.
  2. Quando você inicia o instalador, é solicitada uma senha. Eu digitei "xxx" como senha. (não usado na produção)
  3. Meu servidor roda na máquina 192.168.1.158
  4. No servidor, você deve permitir explicitamente o acesso ao processo TNSLSNR.exe no Firewall do Windows. Este processo escuta na porta 1521.
  5. OPÇÃO A: Para C # (.NET2 ou .NET4), é possível baixar o ODAC11 , do qual você precisa adicionar o Oracle.DataAccess.dll ao seu projeto. Além disso, esta DLL depende de: OraOps11w.dll, oci.dll, oraociei11.dll (130 MB!), Msvcr80.dll. Essas DLLs devem estar no mesmo diretório do EXE ou você deve especificar o caminho DLL em: HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath. Em máquinas de 64 bits, escreva adicionalmente paraHKLM\SOFTWARE\Wow6432Node\Oracle\...
  6. OPÇÃO B: Se você baixou o ODAC12, precisa do Oracle.DataAccess.dll, OraOps12w.dll, oci.dll, oraociei12.dll (160 MB!), Oraons.dll, msvcr100.dll. O caminho do registro éHKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
  7. OPÇÃO C: Se você não deseja grandes DLLs com mais de 100 MB, faça o download do ODP.NET_Managed12.xxxxxxxx.zip no qual você encontra Oracle.ManagedDataAccess.dllapenas 4 MB e é uma DLL gerenciada pura que funciona em processos de 32 e 64 bits também e depende de nenhuma outra DLL e não requer nenhuma entrada do registro.
  8. O seguinte código C # funciona para mim sem nenhuma configuração no lado do servidor (apenas a instalação padrão):
using Oracle.DataAccess.Client;
ou
using Oracle.ManagedDataAccess.Client;

....

string oradb = "Fonte de dados = (DESCRIPTION ="
    + "(ADDRESS_LIST = (ADDRESS = (PROTOCOLO = TCP) (HOST = 192.168.1.158) (PORT = 1521)))"
    + "(CONNECT_DATA = (SERVIDOR = DEDICATED) (SERVICE_NAME = XE)));"
    + "ID do usuário = SISTEMA; Senha = xxx;";

using (OracleConnection conn = new OracleConnection (oradb)) 
{
    conn.Open ();
    using (OracleCommand cmd = new OracleCommand ())
    {
        cmd.Connection = conn;
        cmd.CommandText = "selecione TABLESPACE_NAME em DBA_DATA_FILES";

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

Se SERVICE_NAME=XEestiver errado, você receberá o erro 12514. O SERVICE_NAMEé opcional. Você também pode deixá-lo fora.

Elmue
fonte
Muito obrigado, pela sua solução, encontrei o truque, no meu caso, foi o antivírus que estava bloqueando o programa, portanto não foi possível obter uma conexão com o banco de dados Oracle.
22617 Roblalien
2

Eu também enfrentei o mesmo problema e passei 3 dias para desenterrá-lo.

Isso acontece devido à entrada incorreta do serviço TNS.

Primeiro, verifique se você pode se conectar ao banco de dados em espera do banco de dados primário usando sql> sqlplus sys@orastand as sysdba( orastandé um banco de dados em espera).

Se você não conseguir se conectar, é um problema com o serviço. Corrija a entrada do nome do serviço no arquivo TNS no final primário.

Verifique o banco de dados em espera da mesma maneira. Faça as alterações aqui também, se necessário.

Verifique se o log_archive_dest_2parâmetro tem o nome de serviço correto.

user3778101
fonte
1

Eu recebi o mesmo erro porque o SID remoto especificado estava errado:

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

Eu consultei o banco de dados do sistema:

selecione * de global_name;

e encontrei meu SID remoto ("XE").

Então eu poderia me conectar sem nenhum problema.

Laura Liparulo
fonte
0

No meu caso, o banco de dados ficou sem espaço em disco. O que fez com que não respondesse. Depois de esclarecer essa questão, tudo funcionou novamente.

Pete Brumm
fonte
Como posso descobrir isso?
CodeSlave 14/02
0

Para mim, isso foi causado pelo uso de uma ipadress dinâmica usando a instalação. Reinstalei o Oracle usando uma ipadress estática e tudo estava bem

Steef
fonte
0

Reiniciar a VM funcionou para mim

wishman
fonte
0

Meu problema foi resolvido substituindo o'SID 'no URL por' service name 'e o host correto.

Senhor. Ouriço
fonte
0

tnslsnr está ativo, mas o banco de dados está inativo.

Para o novato da Oracle, não é óbvio que o banco de dados esteja inativo enquanto as conexões forem aceitas.

Eu tive que iniciar o banco de dados manualmente assim

su - oracle
export ORACLE_SID=XE
sqlplus sys as sysdba

E então no console sql

startup

No meu caso, falhei na inicialização, mas recebi outra mensagem de erro e encontrei a fonte de um problema - tive que alterar o nome do host e a inicialização automática do banco de dados estava funcional novamente.

user3132194
fonte
0

Eu implementei abaixo a solução alternativa para resolver esse problema.

  1. Eu configurei o ORACLE_HOME usando o prompt de comando (clique com o botão direito do mouse em cmd.exe e em Executar como administrador do sistema).

  2. Usado abaixo do comando

    set oracle_home="path to the oracle home"

  3. Vá para Todos os programas -> Oracle -ora home1 -> Ferramentas de migração de configuração -> Net Manager -> Ouvinte

  4. Selecione Serviços de banco de dados no menu suspenso. O nome do banco de dados global e o SID são definidos da mesma forma (ORCL no meu caso). Defina o Oracle Home Directory.

Exemplo de janela do Oracle Net Manager da documentação da Oracle: Exemplo do Oracle Net Manager

  1. Clique em Arquivo e salve a configuração de rede.
Raman B
fonte
0

O problema era que o URL da minha string de conexão continha o nome do banco de dados em vez do SID. A substituição do nome do banco de dados pelo SID da conexão com o banco de dados oracle resolveu esse problema.

Para conhecer os SIDs do oracle, você pode procurar no tnsnames.oraarquivo.

XE era o SID real, então é assim que minha cadeia de conexão do tomcat se parece agora:

    <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" />

A versão do meu servidor era "Oracle 11.2 Express", mas a solução também deve funcionar em outras versões.

Benas
fonte
0

No meu caso, faltavam colchetes ao redor do SERVICE_NAME no arquivo 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))
Mosab Sasi
fonte
0

Para aqueles que estão usando spring-boot e jdbc para conexão. Você deve ter cuidado ao escrever jdbcUrl em application.properties

Com o SID na conexão com o banco de dados - source.datasource.jdbcUrl = jdbc:oracle:thin:@[HOST][:PORT]:SID

Com o nome do serviço na conexão db globe.datasource.jdbcUrl = jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE

Isso funcionou para mim :)

surajmall
fonte