Oracle Database

21 февраля 2016

На этой неделе я пытался установить Oracle Database, к которой я буду подключаться для выполнения задания по базам данных. По заданию я должен написать клиента для базы данных — обязательно Oracle Database — на любом ООП языке. Ну, поскольку клепать интерфейсы из долбанутых свинговых элементов на Java я не хочу, я решил взять PHP — верстать-то всяко проще.

Итак, мне нужно было собрать что-то навроде LAMP, но с Oracle Database вместо MySQL. В предыдущем семестре я подключался к MySQL из Java через JDBC и краем глаза видел что-то про ODBC, да и на лекциях про него упоминали. Именно так я и собрался добираться до базы данных из PHP.

Первое, что мне пришло в голову — взять серверную Ubuntu, да и поставить на нее Apache, PHP и Oracle Database. Это, на самом деле, была первая ошибка — Oracle указывает список «сертифицированных» платформ, на которые их база данных ставится, и Debian в этот список не входит. Тем не менее, найти в интернете туториал по установке именно на Ubuntu было несложно, и я, проделав множество хитрых и не очень манипуляций, умудрился установить эту базу. Правда, это еще не все: ведь нужно было создать экземпляр этой базы (чтобы было к чему подключаться), подключиться к нему (внутри экземпляра сама по себе база не создалась, поэтому при подключении выбрасывалась ошибка) и создать саму базу. Кроме того, на этом пути было множество преград различной сложности, обходить которые приходилось, находя крупицы информации о похожих сложностях в интернете.

Надо заметить, что выбранная Ubuntu Server, конечно, легкая, нормально работает с небольшим виртуальным жестким диском и быстро запускается, но совсем консольная. Я-то не против, но ее нельзя скроллить, и мышь она не поддерживает, и вставить текст из машины-хоста не выходит. Поэтому все надо набирать вручную. Так вот скрипт, который создает базу данных через SQL*Plus, занимает 20 строк. Пример этого скрипта в интернете содержал ошибку, а еще если случайно неправильно что-то набрать, то запускаться он не будет. А может начать работу, поругаться на что-то (например, файл не удалось создать) и завершиться. Если его еще раз после этого запустить, то будет ругаться на то, что какие-то файлы уже созданы. Короче, прежде чем 20 строк печатать, надо сначала еще пройтись и от предыдущего запуска все почистить. В какой-то момент мне это все надоело, и я-таки загуглил, что можно выполнять скрипты из файлов — тогда я этот файл один раз хорошо написал и в виртуалку перекинул. Но раз десять я 20 строк вручную печатал, да.

Короче, я-таки смог настроить базу данных, создать пользователей и все такое, но это еще был не конец. Тут меня поджидал ODBC-драйвер, который Oracle додумались не включать в поставку базы данных, а выкладывать отдельными пакетами на своем тормознутом сайте. Чтобы вся эта связка Oracle Database — Oracle ODBC driver — unixODBC — PHP работала, надо настроить listener, который будет откликаться на некоторое имя (DSN) и сообщать, а к кому же на самом деле обращаться за нашей базой данных. Ты вот его настроишь, а он как будто бы и не работает, когда через PHP обращаешься. А как будто бы и работает, если через консоль. Тем не менее, надо было установить ODBC-драйвер, у которого библиотеки слинкованы с неправильными именами, и надо париться с переименованием/созданием симлинков. Потом надо было настроить unixODBC, чтобы он узнал, что у нас установлен этот драйвер. Еще надо не забыть расширение PHP, которое работает с ODBC.

Наконец, к вечеру второго дня, когда все настроено, ты пытаешься достучаться из PHP до базы данных, и не выходит. Перепроверяешь настройки, пытаешься как-нибудь поменять — никакого прогресса. Разве что еще что-нибудь отваливается.

Ну, тут я не выдержал и написал на Stack Overflow. А сам пошел устанавливать Oracle Database в виртуалку с Solaris, потому что, во-первых, он «сертифицированный», а, во-вторых, для него есть установщик с визуальным интерфейсом. Когда во время установки сама софтина поставилась, а вот справиться с первоначальной настройкой базы данных не смогла, я решил, что еще раз я все это делать не хочу — раз их собственный инсталлятор не может этого сделать, то и я не буду.

На третий день за завтраком я решил погуглить, нельзя ли зарегаться в каком-нибудь сервисе и получить в свое распоряжение Oracle Database с доступом по ODBC. Вместо этого я наткнулся на страницу на сайте Oracle, с которой можно скачать образы операционных систем для виртуальной машины. Эти образы содержали уже установленную и настроенную базу данных (или какую еще софтину — в зависимости от образа). Все, что мне оставалось — установить Apache, PHP и ODBC-драйвер, потому что Oracle сделать этого не удосужился. В общем, установить-то получилось, и даже получалось из PHP обратиться к базе данных через ODBC. Но только из консоли. Когда я делал это, открывая в браузере страницу, Apache падал с сегфолтом. Я даже посмотрел core-файл через gdb — сегфолт происходил в библиотеках ODBC-драйвера Oracle. Это очень странно, поскольку консольный PHP почему-то работал через этот драйвер нормально.

Я написал еще один вопрос на Stack Overflow. К первому появился лишь комментарий, в котором попросили добавить еще немного информации. Надо отметить, что подобная проблема была описана на Stack Overflow, только решение мне не подошло (а решение из комментов — пересобрать unixODBC и PHP — я пробовать не хотел). Я попробовал использовать Nginx вместо Apache, но он точно так же выдавал ошибку.

На четвертый день я скачал еще один готовый образ. На этот раз это был образ от Zend — разработчиков PHP. Это был Oracle Linux 6 (Red Hat Enterprise Linux 6, в который Oracle поставили свои нескучные обои и раздают нахаляву в своих образах), в котором установлены Oracle Database и Zend Server. В общем, тут мне даже не пришлось ставить ни Apache (который используется Zend Server), ни PHP (который настраивается через Zend Server), ни даже ODBC-драйвер от Oracle (потому что он уже был установлен вместе с базой данных). Мне нужно было сделать всего пару вещей: включить ODBC-расширение для PHP (один клик в Zend Server), установить и настроить unixODBC (который по какой-то причине установлен не был) и создать базу данных (тоже немного странно, что ее по умолчанию не было). На этот раз меня снова ждала проблема: ODBC-драйвер Oracle пытался найти библиотеку, которая во всех трех предыдущих случаях была, а в этом почему-то не находилась. Тщательные поиски-таки вывели меня на ее новую версию, я создал симлинк, и ничего не заработало. Точнее, из PHP ничего не заработало — isql спокойно подключался и работал.

Тогда я решил посмотреть, нельзя ли из PHP достучаться до базы данных Oracle каким-нибудь другим способм. Оказывается, можно: OCI8. Опять же, поскольку это образ от Zend, расширение уже было установлено, поэтому мне нужно было лишь скинуть пример в виртуальную машину и поменять DSN, имя пользователя и пароль. Так вот это сработало с первого раза.

Казалось бы, хэппиэнд. Тут надо еще раз вспомнить, что у меня было:

1) Ubuntu Server, на котором все работает, только почему-то ODBC-драйвер не видит базу данных, хотя все настройки правильные;
2) Solaris, на котором никто ничего особо не пробовал делать;
3) Oracle Linux 7 от Oracle, на котором был сегфолт при использовании ODBC-драйвера из PHP через Apache;
4) Oracle Linux 6 от Zend, на котором ODBC не работал, зато с полпинка заработал OCI8.

Немаловажная деталь: Zend Server триальный, и через 30 дней превращается в тыкву Lite-версию. Я понятия не имею, что это будет означать для меня, но и никакого желания потом это все заново перенастраивать у меня тоже нет.

Oracle Linux 7 выглядит стильнее и удобнее, да и пользователи там были настроены получше. Проблема только в том, что он себе отхватил дисков на 60 гб, а та же виртуалка от Zend — всего на 30.

Решил я, короче, попробовать установить OCI8 еще где-нибудь, чтобы можно было выбирать между рабочими виртуалками. В OL7 у меня этого сделать не получилось. Тут я возвращаюсь в Ubuntu Server (на который я выделил всего 10 гб) и пытаюсь установить OCI8 там. Это у меня опять не выходит, но я зачем-то решаю посмотреть на настройки еще раз — теперь-то я знал, как они выглядели на машинах, где все работало, и мог сравнить. Настройки DSN выглядели как-то пространно, хотя я помнил, что на другой машине мне хватало и пяти строчек. Прописываю второй DSN в пять строчек. Работает.

Оказалось, что у меня была глупая ошибка, которую было сложно заметить среди той кучи строк. Второй DSN был настроен без ошибок, а все остальное на машине было в порядке, поэтому я смог подключиться к базе данных через ODBC из PHP.

Я ответил на свой же вопрос на Stack Overflow, удалил Solaris, и пока что планирую использовать виртуалку с Ubuntu в качестве пробного сервера. Виртуалки с Oracle Linux я пока удалять не стал — вдруг пригодятся еще.

Не думаю, что кому-то что-то было понятно из всего этого графоманства, но хочу заметить, что все эти упражнения я провел лишь ради того, чтобы выполнить задание по написанию клиента к базе данных. Не задание по установке операционных систем и не задание по установке и настройке базы данных — по написанию клиента. Возможно, это было бы куда проще, если бы я собирался написать его на Java — особенно, если бы я сразу скачал образ с установленной и настроенной Oracle Database. Только вот это задание должен сделать не один я, а двадцать человек из двух групп. Нельзя было настроить сервер с базой данных один раз, создать каждому студенту по пользователю в базе данных и просто дать всем доступ? Мне кажется, что как-то неправильно, когда задание по написанию клиента к базе данных неявно включает в себя задание по ее установке и настройке. Причем установка и настройка оцениваться не будут, несмотря на то, что без них у студента просто не будет возможности тестировать свой клиент.