Вопрос

Недавно мы изменили физическую БД, новые серверы, новые местоположения, ту же схему базы данных и данные, и после этого изменения всякий раз, когда мы пытаемся подключиться напрямую к БД в наших собственных настольных приложениях, примерно в половине случаев мы получаем эту ошибку:

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

В остальное время подключается сразу, без проблем.Наши приложения, которые устанавливают соединения через JDBC, похоже, не имеют никаких проблем, но они возникают, когда мы проходим через что-то, что выполняет поиск в tnsnames.ora (по крайней мере, я так предполагаю).TNSPING работает на 100%, но использование исполняемого файла Oracle, такого как SQLLDDR, дает сбой как минимум в 50% случаев.Вот анонимизированный фрагмент нашего файла TSNNAMES и вывод TNSPING:

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

И ТНСПИНГ:

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)

У меня есть SID БД, на который опираются соединения JDBC, но добавление его в tnsnames.ora не повышает вероятность установления соединения.Я недостаточно знаю о том, как Oracle использует файл tnsnames для разумного решения этой проблемы, поэтому, если у вас есть предложения или вы видите что-то, чего явно не хватает, дайте мне знать.

РЕДАКТИРОВАТЬ:Новая БД может представлять собой две базы данных с балансировкой нагрузки, что может быть частью проблемы.

Это было полезно?

Решение

Недавно у нас была похожая проблема с нашим приложением. Приложение иногда подключалось к Oracle RAC, а иногда с ORA-12545. Короче говоря, проблема заключалась в том, что у сервера было настоящее имя, когда мы использовали виртуальные IP-адреса в TNSNAMES.ORA. Как только мы добавили сопоставление имени сервера с IP-адресом через файл system32 \ drivers \ etc \ hosts, все стало работать правильно.

Я написал немного больше в своем блоге < бесстыдная реклама > http: //dcarapic.blogspot.com/2009/04/intermittent-ora-12545-error.html < / бесстыдная реклама >

Другие советы

Ах, должен любить прерывистые проблемы :) (Далее мне пришлось заменить подчеркивающий персонаж, так как я не знаю экономного чара для этого языка вики)

Вы всегда используете одного и того же пользователя ОС для подключения и выполнения tnsping?

Проверьте переменные среды TNS[underscore]ADMIN, указывающие на разные местоположения tnsnames.ora.Просканируйте клиент на наличие дубликатов tnsnames.ora;либо в местах, указанных в $TNS[underscore]ADMIN, либо в разных $ORACLE[underscore]HOMES (например,если у вас установлено 2 клиента Oracle).

Аналогично убедитесь, что вы используете одни и те же переменные среды $ORACLE[underscore]HOME и $PATH для всех попыток подключения и tnsping.(Например.всегда один и тот же пользователь ОС или каждый пользователь имеет одинаковые значения)

Я вижу, что выходные данные tnsping сообщают о версии 9.2, так что это маловероятно, но в 11g БД регистрируется прослушивателем, что может занять минуту или около того.(возможно, верно и для 10 г).Попытки подключения до этого не найдут цель.

Еще одна маловероятная возможность: рекламируется ли служба с тем же именем на старом хост-сервере?Удалите его, если это возможно.

После этого я бы начал смотреть саму сеть.Всегда ли пинг сервера проходит успешно и быстро?Если вы используете имя хоста, а не IP-адрес в tnsnames.ora, надежно ли имя хоста преобразуется в правильный IP-адрес (nslookup).Есть ли локальный брандмауэр, и если да, то как он себя ведет?

С уважением Карл

Если вы используете Oracle 10g, вы можете использовать вместо этого обработчик Easy Connect:

//servername/instancename

,

//1.2.3.4/my.url.com

в вашем случае.

Он невосприимчив к множеству проблем TNSNAMES.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top