Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Oracle Client - часто возникающие проблемы и их решения

oracle
windows
Теги: #<Tag:0x00007f7b6914f668> #<Tag:0x00007f7b6914f410>

(German Komashko) #1

В не зависимости от того какой подход вы используете и на каком языка пишите, если вам нужно “общаться” с Oracle DB - скорее всего вы выберете Oracle Client как средство коммуникации, так как иных путей почти нет.

Если вам когда-нибудь приходилось не однократно устанавливать Oracle Client, вы наверняка заметили, какое это порой не легкое дело. Я не буду описывать как клиент следует устанавливать, я лишь опишу список наиболее вероятных проблем которые часто возникают после установки и решения для этих самых проблем, а так же постараюсь дать пару советов.

Самые популярные проблемы и их решения:

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

  • Убедитесь в том что вы добавили TNSNAMES.ORA файл и то что он расположен именно в %OracleClientDirectory%\network\admin\
  • TNS в TNSNAMES.ora описан корректно.
  • Попробуйте добавить ORACLE_HOME в Windows Environment Variables. Путь для ORACLE_HOME выглядит примерно так C:\App<machine name>\product<prudoct number> (важно, что-бы путь заканчивался именно на папку, под которой лежит BIN или bin папка. А также что-бы в конце пути не было ‘’)
  • Ссылка на оракл клиент так же должен быть в Path. Ссылку на папку в Path прописывает сам Oracle Client, но если вы устанавливаете не в первый раз, то там мог образоваться бардак. Поэтому, путь на клиент в Path должен быть только один. Выглядит ссылка примерно так C:\App<machine name>\product<prudoct number>\bin; . Важно что-бы она указывала именно на bin нашего клиента.

Could not create an environment: OCIEnvCreate returned -1

  • Первая и наиболее вероятная причина: несовместимость разрядности, если у вас 32-битный клиент, то убедиться что ваша процесс который пытается сделать что-то с оракл клиентом запускается или в 32-ом или в универсальном режиме. Ну и аналогично для 64-битного оракл клиента.
  • Отсутствие прав, возможно на вашей машине есть некоторые ограничения, которые не позволяют процессу достучаться к оракл клиенту
  • Если вышеперечисленное не помогло, попробуйте переустановить оракл клиент.

ORA - timeout occured

  • Вариантов в этом случае аж один. Нету доступа к базе, либо административного либо база просто не доступна на данный момент.

Полезности штуки или tips&tricks:

В борьбе с, не желающим работать, оракл клиентом - лучший помощник это cmd.
И вот некоторые из полезных команд, которые помогут локализовать причину сбоя:

  1. tnsping <tns name> - tnsping утилита которая, делает пробный конекшен, и вот некоторые из результатов
  • TNS-03505 - Failed to resolve name. Это тоже самое что и “ORA-12154 TNS: could not resolve the connect identifier specified” решение которой, описано в первым пункте. tnsping либо не может найти TNSNAMES.ORA или найти указанный <tns name>. Еще раз проверьте правильность написание вашего ORACLE_HOME и Path, если вам кажется, все правильно и нечего уже исправлять - подышите воздухом и проверьте еще раз, помогает:)
  • Если вы увидите что-то вроде этого:
    Used TNSNAMES adapter to resolve the alias:
    <тут все реквизиты базы>
    OK <n msc>
    
    то все у вас работает и оракл клиент может подключиться к базе и распознать tns name, а если проблема все еще возникает в вашей программе, значит проблема именно в вашем коде или в библиотеке которую вы используете для работы с оракл клиентом.
  • Такой вариант:
    Used TNSNAMES adapter to resolve the alias:
    <тут все реквизиты базы>    
    TNS - timeout occured 
    
    очевидно, что - это тоже самое что и ORA - timeout occured. Либо база не доступна, либо вам блокирует доступ какой-нибудь магический файрвол.
  1. Path - покажет вам содержимое вашего Path, оно просто позволит вам оперативно убедиться в том что путь к бин папке вашего оракл клиента прописан правильно.
  2. set ORACLE_HOME - покажет вам содержимое ORACLE_HOME
  3. set ORACLE_HOME = "some path" - как вы догадались, можно таким способом поиграться с пазом в открытой сессии консоли и сделать еще раз, после этого сделать tnsping <tns name>.
  4. where tnsping - нужен для определение того, какой оракл клиент используется в данный момент, полезен тогда, когда у вас больше чем один клиент. Кстати, когда у вас больше чем один клиент, то привилегированным будем именно тот, чей путь указан в ORACLE_HOME.

На этом пожалуй и закончу. Главное уделяйте внимание деталям, так как oracle client очень капризный.

Удачи!


(rmerkushin) #2

Добавлю еще один очень часто возникающий “затык” с ораклом. Это NLS_LANG (без которого все не ASCII символы будут выглядеть как кракозябры :smile: ), который нужно прописать либо в переменных окружениях, либо выставлять в клиенте. Чтобы узнать какая кодировка у БД нужно выполнить что-то вроде этого:

SELECT VALUE
FROM nls_database_parameters
WHERE PARAMETER = 'NLS_CHARACTERSET'

или спросить у вашего DBA :smile:

Например: set NLS_LANG=RUSSIAN_CIS.CL8MSWIN1251 или export NLS_LANG=RUSSIAN_CIS.CL8MSWIN1251


(German Komashko) #3

А я так долго думал как с этим справится) Большое спасибо.