среда, 28 марта 2012 г.

[prog] Насколько просто поставить себе ODBC-драйвера от Oracle?

Как оказалось, совсем не сложно. Если знать как :)

Первоначально этой задачей занимался мой сотрудник. Он скачал что-то под названиями Oracle Database Client, сначала версии 10, затем 11. Приличного веса дистрибутивы с GUI-выми инсталляторами. Но почему-то ни один из них нормально 32-х битовый ODBC-драйвер поставить не смог (нормально, это что бы в ODBC connection string можно было указать что-то вроде “Oracle ODBC Driver” в параметре Driver).

Памятуя мудрость о том, что хорошо сделанное – это сделанное самим собой, я решил тряхнуть стариной и попробовать справиться с Oracle Database Client самостоятельно. От чего получил массу интересных ощущений.

Инсталлятор клиента 10-й версии заставлял Windows 7 переключаться в какой-то ущербный видеорежим, поскольку не мог работать в штатном режиме. Что уже вызывало подозрения.

Далее инсталлятор предлагал выбрать одну из готовых конфигураций или же определить custom-конфигурацию. В режиме custom-конфигурации я выбрал только ODBC-драйвера, но когда перед началом инсталляции была показана итоговая информация по устанавливаемым компонентам, то там было перечислено еще штук двадцать наименований. И на диск ставилось несколько десятков мегабайт всякой шняги (включая, как мне показалось, не только JRE, но еще и Perl). Плюс к тому инсталлятор ожесточенно ругался на то, что длина значения PATH больше 1023 символов и поэтому он не может это значение модифицировать.

Инсталлятор от 11-й версии уже нормально переваривал количество цветов в штатном видеорежиме. Но так же ставил туеву хучу всякой херни вместе с ODBC-библиотеками. И так же ругался на длину значения PATH.

Но при этом у инсталлятора от 10-й версии была большая кнопка “Deinstall components” на главном диалоге. А вот в 11-й версии ее уже не было. И я так не нашел способа цивильного удаления установленной Oracle-овским инструментом требухи со своей машины – вычищал ручками.

В результате обнюхивания того дерьма, которым Oracle-овский инсталлятор засерал мой винчестер, удалось найти маленький html-файлик с инструкцией по ручной установке ODBC-драйверов под названием ODBC_IC_Readme_Win.html. В котором все просто и доступно расписано – качаем два zip-архива из состава Instant Client, создаем вручную папочку на диске, туда оба эти архива распаковываем один за одним, запускаем odbc_install, модифицируем PATH + еще пара тому подобных операций (вот, например, такая инструкция для Oracle 10g).

Самое хорошее в этом то, что этот способ реально работает. Такое впечатление, что Instant Client-ом занимаются в Oracle люди старой закалки, которые не боятся ставить и настраивать все ручками. Поэтому у них и работающие вещи получаются.

А вот разработчикам GUI-вых инструментов чего-нибудь вправить не помешало бы (или руки, или голову). Поскольку от знакомства с их творениями остается твердое впечатление, что чем больше и богаче контора, тем более говеный софт она производит.

Кстати, еще о качестве софта от Oracle. Примечательно, что попытка скачать архив с Oracle Instant Client без предварительного логина на сайт Oracle приводит вот к такому сообщению о системной ошибки. Хотя контора попроще наверняка бы просто написала, что для доступа к архиву нужно зайти на сайт под своим аккаунтом.

8 комментариев:

имя комментирует...

ничуть не пытаясь оправдать говнооракл, отмечу, что "Database Client" != "ODBC Driver"

и более того, что жадная контора может специально пускать свой клиент *мимо* драйвера, чтобы его не юзали с другими бд, или хотя бы для того, чтобы проще использовать нестандартные возможности и не дебажить их в драйвере

ну а раз (предположительно) клиент ходит в бд мимо драйвера, то драйвер там запросто может не работать...

вот оно, enterpise quality и Hardware and Software, Engeneered to Work Together!

имя комментирует...

кстати, сам только что напоролся на упомянутую тобой ошибку

решил я прочесть faq

вижу: The Instant Client interoperates with any database version that the full Oracle Client interoperates with. Please see the interoperability matrix: Metalink Note 207303.1

проходим по последней ссылке и видим System error.

Roman Yankovsky комментирует...

"жадная контора может специально пускать свой клиент *мимо* драйвера"

Не понимаю, что значит "мимо драйвера". Оракловский клиент другими словами и есть тот самый драйвер, другие ему не нужны. Причём присутствует он на большом количестве платформ ещё с тех лет, когда всех этих ODBC и в проекте не было.

Как раз наиболее распространённый сценарий доступа к БД оракла -- этот как раз использование родного оракловского интерфейса.

eao197 комментирует...

В том-то и дело, что Database Client включает в себя ODBC Driver и даже ставит его, но как-то странно.

Если пытаться его активировать не через диалог создания DSN операционной системы, а через параметр Driver в connection string, то нужно указывать имя {Microsoft ODBC for Oracle}. При этом, как я понимаю, используется не прямая работа с Oracle ODBC, а через какой-то MS-овский промежуточный слой. По крайней мере при возникновении каких-либо ошибок сообщения о них были явно похожи на MS-совские сообщения, а не Oracle-овские.

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

А так, похоже, Oracle ODBC является довольно ущербным тонким слоем над Oracle OCI (который в любом случае нужен на машине).

имя комментирует...

@Roman Yankovsky

я обдумал твой коммент и уже хотел ответить, но меня тошнит от деталей взаимотношений ms & oracle и всех этих виндовых подробностей

тем более, что Евгений Охотников упомянул главную цель -- прямое взаимодействие; вот про нее можно поговорить

@Евгений Охотников

скажу сразу, с ораклом я напрямую не работал и его закидонов не знаю

но утверждение "При этом, как я понимаю, используется не прямая работа с Oracle ODBC, а через какой-то MS-овский промежуточный слой" для меня выглядит внутренне противоречивым

прямая работа -- это когда сервер БД открывает серверный tcp socket, твоя прога открывает клиентский tcp socket, и они обмениваются бинарными пакетами через tcp

понятно, парсить и генерить эти пакеты лучше не самому, а

1. слинковавшись с сишным кодом, предоставленным в данном случае ораклом, статически или динамически

либо 2. слинковавшись с одной из с++ либ, которая дает независимость от БД, опять статически или динамически

eao197 комментирует...

@имя:

У тебя наблюдается незнание предмета, имхо.

ODBC -- это и есть тот слой, который скрывает от программы работу с протоколом конкретной СУБД. Приложение линкуется к DLL-ке odbc32 (под 32-х битовой виндой) и использует оттуда стандартизированный API.

Когда приложение делает вызовы ODBC API из odbc32, та делегирует вызовы конкретному ODBC-драйверу (предоставляемому разработчиком СУБД или еще кем-то).

Так вот, в случае с {Microsoft ODBC for Oracle} происходила, как мне кажется, работа через промежуточный ODBC-драйвер от MS. Т.е. odbc32 грузила Oracle-овский драйвер не напрямую. Вместо этого загружался какой-то MS-овский псевдодрайвер, который уже загружал Oracle-драйвер.

Кстати говоря, ODBC -- это такая псевдонезависимость от СУБД. Как только возникает задача выжимать из СУБД производительность, сразу же приходится переходить на конкретные диалекты конкретных SQL-ей. И независимость от СУБД, фактически, теряется.

Другое дело, что при работе с OTL довольно тяжко заставить одно и то же приложение работать с MSSQL через ODBC, а с Oracle через OCI. Поэтому приходится и с Oracle через ODBC общаться.

eao197 комментирует...

Какая-то странная ситуация. В почте у меня есть еще один комментарий от тов. имя, а здесь его нет. То ли комментарий был удален автором, то ли Блоггер сбойнул.

На всякий случай упомяну, что я говорил не о "прямом взаимодействии" с СУБД Oracle, а о "прямой работе с ODBC-шным драйвером от Oracle".

имя комментирует...

@Евгений Охотников

это *точно* блоггер сбойнул

(и я как раз хотел спросить, не удалил ли его ты -- я знаю, что когда я удаляю свой коммент, блоггер пишет "коммент удален автором", а когда хозяином блога -- то не знаю что происходит)

могу перезапостить мой коммент если внезапно он кому-то интересен, но *мне* ты ответил, и у меня вопросов нет