Ошибка Ora 12154

Недавно я разместил одно веб-приложение на одном из моих серверов разработки. Я использую oracle, asp.net и С#. Когда я запускаю приложение на сервере, все работает нормально, но когда я пытаюсь запустить приложение за пределами сервера (например, используя мой компьютер), я получаю эту ошибку:

ORA-12154: TNS:could not resolve the connect identifier specified

Если я запустил приложение в своем компьютере с визуальной студией, он отлично работает.

Oracle установлен на сервере "A" , а приложение находится на сервере "B" . Сервер "A" находится в одном домене, а сервер "B" находится в другом домене. Мой компьютер находится в том же домене с сервером "A" .

В моем компьютере я могу найти файл tnsname.ora в C:\oracle\product\10.2.0\client_1\NETWORK\ADMIN, но на сервере "B" я не могу найти его где-нибудь

любая идея? Спасибо за помощь.

9 ответов

Угадайте: клиент Oracle не установлен на сервере B.

Если у вас установлен клиент oracle, вы все равно можете поместить файл tnsnames в любое место (например, каталог на сетевом ресурсе). Чтобы сделать это, установите системную переменную TNS_ADMIN (System Properties- > Advanced- > Environment Variables на XP) в каталог, содержащий ваши файлы tnsnames.

Для меня, например, у меня есть системная переменная: TNS_ADMIN - C:\oracle\ora92\network\ADMIN


Вы пробовали это еще? (от http://ora-12154.ora-code.com/)

ORA-12154: TNS: не удалось разрешить идентификатор подключения, указанный Причина. Соединение с базой данных или другой службой было запрошено с использованием идентификатора подключения, а указанный идентификатор соединения не мог быть разрешен в дескриптор соединения с использованием одного из настроенных методов именования. Например, если тип используемого идентификатора подключения был именем сетевой службы, то имя нетто-службы не могло быть найдено в репозитории метода имен или хранилище не могло быть найдено или достигнуто. Действие: - Если вы используете локальное имя (файл TNSNAMES.ORA):

  • Убедитесь, что "TNSNAMES" указан как одно из значений параметра NAMES.DIRECTORY_PATH в профиле Oracle Net (SQLNET.ORA)

  • Убедитесь, что файл TNSNAMES.ORA существует и находится в соответствующем каталоге и доступен.

  • Убедитесь, что в файле TNSNAMES.ORA существует имя сетевой службы, используемое как идентификатор соединения.

  • Убедитесь, что в файле TNSNAMES.ORA нет синтаксических ошибок. Ищите непревзойденные круглые скобки или бродячие символы. Ошибки в файле TNSNAMES.ORA могут сделать его непригодным.

  • Если вы используете имена каталогов:

  • Убедитесь, что "LDAP" указан как одно из значений параметра NAMES.DIRETORY_PATH в профиле Oracle Net (SQLNET.ORA).

  • Убедитесь, что сервер каталогов LDAP установлен и что он доступен.

  • Убедитесь, что имя сети или имя базы данных, используемое в качестве идентификатора подключения, настроено в каталоге.

  • Убедитесь, что используемый контекст по умолчанию правильный, указав полное имя сетевой службы или полный LDAP DN в качестве идентификатора подключения

  • Если вы используете удобное имя для подключения:

  • Убедитесь, что "EZCONNECT" указан как одно из значений параметра NAMES.DIRETORY_PATH в профиле Oracle Net (SQLNET.ORA).

  • Убедитесь, что указаны имя хоста, порта и службы.

  • Попробуйте включить идентификатор подключения в кавычки. Для получения дополнительной информации об именах см. Руководство администратора Oracle Net Services или руководство по операционной системе Oracle.


Устранение ошибок TNS может быть настоящей болью. Несколько вещей, о которых нужно помнить.

Большинство сред разработки (например, visual studio) сохраняют собственную копию информации о подключении TNS и не используют файл TNSNAMES.ora. Файл, в котором хранится эта информация, не должен называться TNSNAMES.ora, это просто имя по умолчанию. Это может быть причиной того, что вы не можете найти его на сервере B.

Если у вас есть клиентское программное обеспечение oracle (или база данных оракула), вы можете использовать tnsping, чтобы проверить, правильно ли настроен ваш файл TNSNAMES.ora.

Наиболее часто возникающие проблемы с конфигурацией файла TNSNAMES.ora используют неправильное имя службы и/или неправильное имя хоста. Возможно, вам придется изменить "ODB_A" на "ODB_A.WORLD" или наоборот, в зависимости от настроек SQLNET. Для Oracle 10 последний параметр SQLNET по умолчанию. Для последнего вам нужно использовать ping, чтобы увидеть сервер "А", и знать, нужно ли вам использовать "SERVERA" или "SERVERA.DOMIN.COM" или IP-адрес.


Кажется, вам нужно установить Oracle Client на "Сервер B" (сервер приложений) и настроить его файл TNSNAMES.ORA. Это необходимо, так как в противном случае исполняемый код не имеет понятия, где искать базу данных, которую вы используете в приложении (возможно, вы настроили источник данных в файле web.config или в некотором жестком коде). Помните - вы не можете получить доступ к Oracle (легко) без Oracle Client.


Добавьте среду:

Variable Name: TNS_ADMIN
Variable Value: (YourDrive):\app\(UserName)\product\11.2.0\dbhome_1\NETWORK\ADMIN


Установлен ли ORACLE_HOME на сервере B?


Возможные разрешения -

Убедитесь, что TNSNAMES.ORA существует и доступен.

Убедитесь, что в TNSNAMES.ORA нет синтаксических ошибок.

Убедитесь, что строка подключения верна.

Проверьте, есть ли какие-либо проблемы с DNS.

Если проблема связана с подключением к серверу с использованием PL SQL-разработчика client.try для установки разработчика SQL в программном файле вместо файлов Program Files (x86)


Я столкнулся с подобной проблемой. Следующий код работал в моей системе, но не работал на другом сервере, хотя я добавил запись tns в файл tnsnames.ora.

con = new OracleConnection();
con.ConnectionString = "User Id=username;Password=password;Data Source=uit45";
con.Open(); // throws error here

После рытья и копания я нашел решение для этого. Мы должны игнорировать запись в tns файле и можем вводить tns-запись в качестве строки подключения, которая отлично работает для меня. Попробуйте приведенный ниже код.

con = new OracleConnection("Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=db-uit45.xxx)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SID=uit45)));User Id=username;Password=password");
con.Open();

Обратите внимание, что вам нужно указать соответствующие значения, особенно для HOST,PORT,SID,User Id и Password.


Была та же проблема. Оказывается, в TNSNAMES.ORA в среде развертывания были разные ADDRESS_NAME и SID/SERVICE_NAME, и приложение было настроено на использование SID, что вызвало проблему.

Строка подключения должна содержать ADDRESS_NAME, а не идентификатор SID

licensed under cc by-sa 3.0 with attribution.