Domanda

Di recente abbiamo modificato DB fisici, nuovi server, nuove posizioni, stesso schema e dati del database e dopo la modifica, ogni volta che proviamo a connetterci direttamente al DB nelle nostre applicazioni di tipo desktop circa la metà delle volte riceviamo questo errore :

SQL*Loader-704: Internal error: ulconnect: OCIServerAttach[0]
ORA-12545: Connect failed because target host or object does not exist

Il resto del tempo, si connette subito senza problemi. Le nostre applicazioni che stabiliscono connessioni tramite JDBC non sembrano avere alcun problema, ma lo facciamo quando si passa attraverso qualcosa che esegue una ricerca tnsnames.ora (o almeno questo è il mio sospetto). TNSPING funziona al 100% ma l'utilizzo di un eseguibile Oracle come SQLLDDR fallisce almeno il 50% delle volte. Ecco un'istantanea anonima del nostro file TSNNAMES e un output TNSPING:

DB_CONNECTION =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 1.2.3.4)(PORT = 1521))
  )
  (CONNECT_DATA =
    (SERVICE_NAME = MY.URL.COM)
  )
)

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

Ho il SID del DB, che è ciò su cui si basano le connessioni JDBC ma aggiungendolo a tnsnames.ora non migliora le probabilità di stabilire una connessione. Non so abbastanza su come il file tnsnames sia utilizzato da Oracle per risolvere in modo intelligente questo problema, quindi se hai suggerimenti o vedi qualcosa che ovviamente manca, per favore fatemelo sapere.

EDIT: i nuovi DB possono essere due database con bilanciamento del carico che possono essere parte del problema.

È stato utile?

Soluzione

Di recente abbiamo riscontrato un problema simile con la nostra applicazione. L'applicazione a volte si connetteva a Oracle RAC ea volte si lamentava con ORA-12545. In breve, il problema era che il server aveva un vero nome mentre stavamo usando indirizzi IP virtuali in TNSNAMES.ORA. Una volta aggiunta la mappatura del nome del server all'indirizzo IP tramite il file system32 \ drivers \ etc \ hosts tutto ha iniziato a funzionare correttamente.

Ho scritto un po 'di più nel mio blog < pubblicità spudorata > http: //dcarapic.blogspot.com/2009/04/intermittent-ora-12545-error.html < / spudorato annuncio >

Altri suggerimenti

Ah, devo amare i problemi intermittenti :) (Di seguito ho dovuto sostituire il carattere di sottolineatura perché non conosco il carattere di escape per questo linguaggio wiki)

Usi sempre lo stesso utente del sistema operativo per connetterti e fare il tnsping?

Controlla le variabili di ambiente TNS [carattere di sottolineatura] ADMIN che punta a diverse posizioni tnsnames.ora. Esegui una scansione del client per duplicare tnsnames.ora; in posizioni indicate da $ TNS [carattere di sottolineatura] ADMIN o in diversi $ ORACLE [carattere di sottolineatura] HOMES (ad es. se hai 2 installazioni client Oracle).

Allo stesso modo controlla che stai usando le stesse variabili d'ambiente $ ORACLE [underscore] HOME e $ PATH per tutti i tentativi di connessione e tnsping. (Ad esempio, sempre lo stesso utente del sistema operativo o ogni utente ha gli stessi valori)

Vedo che l'output di tnsping riporta la versione 9.2 quindi non è probabile, ma in 11g il DB si registra con l'ascoltatore che può richiedere circa un minuto. (forse anche vero con 10g). Tentativi di connessione prima di questo non troveranno l'obiettivo.

Un'altra possibilità improbabile: un servizio con lo stesso nome di servizio è ancora pubblicizzato sul vecchio server host? Rimuovilo se possibile.

Dopo di che vorrei iniziare a guardare la rete stessa. Un ping del server è sempre efficace e rapido? Se si utilizza il nome host anziché IP in tnsnames.ora, il nome host si risolve in modo affidabile nell'IP corretto (nslookup). Esiste un firewall locale e, in tal caso, si sta comportando?

Saluti Karl

Se si utilizza Oracle 10g, è possibile utilizzare invece un Easy Connect gestore:

//servername/instancename

,

//1.2.3.4/my.url.com

nel tuo caso.

È immune da lotti di TNSNAMES problemi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top