Hinky o Oracle Connection (TNSNAMES.ORA Ajuda)
Pergunta
Recentemente, mudou física DB, os novos servidores, novos locais, mesmo esquema de banco de dados e de dados e desde a mudança mais, sempre que tentar ligar diretamente para o DB em nossas próprias aplicações do tipo de mesa cerca de metade do tempo que recebo este erro :
SQL*Loader-704: Internal error: ulconnect: OCIServerAttach[0]
ORA-12545: Connect failed because target host or object does not exist
O resto do tempo, ele se conecta imediatamente, sem quaisquer problemas. Nossas aplicações que estabelecem conexões via JDBC não parece ter quaisquer problemas, mas o que fazemos quando passar por algo que faz um tnsnames.ora pesquisa (ou esse é o meu palpite, pelo menos). Tnsping obras 100%, mas usando um executável oráculo como SQLLDDR falhar pelo menos 50% do tempo. Aqui está um snppet anónimos do nosso arquivo TSNNAMES e uma saída de TNSPING:
DB_CONNECTION =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 1.2.3.4)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = MY.URL.COM)
)
)
E o TNSPING:
C:\>TNSPING DB_CONNECTION
TNS Ping Utility for 32-bit Windows: Version 9.2.0.1.0
Copyright (c) 1997 Oracle Corporation. All rights reserved.
Used parameter files:
C:\oracle\ora92\network\admin\sqlnet.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = 1.2.3.4)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = MY.URL.COM)))
OK (200 msec)
Eu tenho o SID do DB, que é o que as conexões JDBC dependem mas adicionando-o ao tnsnames.ora não melhora as probabilidades de fazer uma ligação. Eu não sei o suficiente sobre como o arquivo tnsnames está sendo usada pela Oracle para inteligentemente resolver esse problema por isso, se você tiver sugestões ou ver algo que é, obviamente, faltando, por favor me avise.
EDIT:. O novo DB pode ser duas bases de dados carga balanceada que pode ser parte do problema
Solução
Nós recentemente teve um problema semelhante com a nossa aplicação. A aplicação às vezes se conectar ao Oracle RAC e às vezes ele iria reclamar com ORA-12545. Em suma, o problema foi que o servidor tinha um nome real, enquanto nós estávamos usando endereços IP virtuais em TNSNAMES.ORA. Uma vez que nós adicionamos o mapeamento do nome do servidor para o endereço IP via system32 \ drivers \ tudo o arquivo etc \ hosts começou a trabalhar corretamente.
Eu escrevi um pouco mais no meu blog
Outras dicas
Ah, tem que amar os problemas intermitentes :) (No seguinte, tive de substituir o caractere sublinhado como eu não sei o caractere de escape para essa linguagem wiki)
Você está sempre usando o mesmo usuário OS para se conectar e fazer o tnsping?
Verifique se há TNS variáveis ??de ambiente [sublinhado] ADMIN apontar para locais diferentes tnsnames.ora. Fazer uma varredura do cliente para tnsnames.ora duplicado; quer em locais apontado por $ TNS [sublinhado] Admin ou em diferentes $ ORACLE [sublinhado] Casas (por exemplo, se você tem 2 instalações de cliente Oracle).
Da mesma forma verificar se você está usando a mesma $ ORACLE [sublinhado] HOME e $ PATH variáveis ??de ambiente para todas as tentativas de conexão e tnsping. (Por exemplo, sempre o mesmo usuário OS ou cada usuário tem os mesmos valores)
Eu vejo que a saída tnsping relatórios versão 9.2 de modo que este não é provável, mas em 11g os registros de banco de dados com o ouvinte que pode demorar um minuto ou assim. (Talvez também verdadeiro com 10g). Tentativas de ligação antes de esta não vai encontrar o alvo.
Outra possibilidade improvável - é um serviço com o mesmo nome serviço ainda anunciado no servidor host de idade? Removê-lo, se possível.
Depois que eu iria começar a olhar para a própria rede. É um ping do servidor sempre bem sucedida e rápida? Se você estiver usando o nome do host em vez de IP no tnsnames.ora, faz o hostname resolver de forma confiável para o IP correto (nslookup). Existe um firewall local e se assim é que se comportando?
Saudações Karl
Se você estiver usando Oracle 10g
, você pode usar um manipulador de Easy Connect
vez:
//servername/instancename
,
//1.2.3.4/my.url.com
no seu caso.
Ele é imune a muitos de questões TNSNAMES
.