Свидание с Оракулом

Источник: oracloid
Константин Клягин

Установка и доступ к Oracle

Некоторым людям удалось заработать много денег, занимаясь программированием. Многие мечтают стать такими же успешными и богатыми, как Билл Гейтс. Но в его биографии, кроме успеха с продажей MS-DOS в 19-летнем возрасте, нет ничего интересного.

Поэтому я бы предпочел Билла Ларри Эллисону - основателю Oracle Corporation, второму миллионера IT-бизнеса, который принимает личное участие в гонках на яхтах, летает на собственном истребителе и встречается с топ-моделями. А основной продукт компании - реляционная база данных Oracle - самая мощная СУБД в мире. И мы, вдохновленные жизненным примером Ларри, рассмотрим его детище в деталях.

Ставить мы будем последнюю версию - Oracle 10g. Под Linux. С тех пор как в 2002 году Ларри объявил переход всего бизнеса на эту ОС, выбор операционки стал делом принципа. Инсталляцию, как это ни странно, можно скачать совершенно бесплатно с сайта www.oracle.com. Не надо пугаться, когда у тебя попросят логин с паролем. Пара кликов на Sign Up, заполняем форму с именем, фамилией, должностью и местом проживания. После подтверждения регистрации открывается окошко Download. Немного заморочено, но со второй попытки разобраться можно. И все это еще цветочки по сравнению с тем, что придется сделать для того, чтобы установить все это хозяйство. Забудь о простоте MySQL. Это Oracle!

Ларри Эллисон: выступление на тему лидерства web-сервера Apache

Однажды Microsoft уже был убит продуктом с открытым исходным кодом. Зарезан, растерт, выброшен с рынка за неуместность. У них в руках была виртуальная монополия на web-серверы, и они были стерты с лица земли. И они еще получат от Linux"а.

Ставим!

Скачанный с oracle.com файл называется ship.db.lnx32.cpio.gz и весит около 600 Мб. Следуя инструкциям на сайте, мы для начала разворачиваем этот архив:

$ gunzip ship.db.lnx32.cpio.gz

$ cpio -idmv < ship.db.lnx32.cpio

В Disk1/, помимо прочего, будет помещен скрипт runInstall, но не стоит торопиться с победными криками и его запуском. Нужно подготовить систему к установке. Простота - отнюдь не девиз Oracle. Я бы на их месте сделал скрипт, который создавал бы нужные группы и директории. Выглядел бы он примерно так:

листинг

groupadd oinstall

groupadd dba

mkdir -p /u01/app/oracle

useradd -g oinstall -d /u01/app/oracle -G dba oracle

passwd oracle

chown -R oracle:oinstall /u01/app/oracle

chmod -R 775 /u01/app/oracle

Если бы этим все приготовления ограничивались, прикрутка Oracle не напоминала бы запуск космического корабля. Но мощность стоит приложенных усилий, да и ставится обычно эта СУБД на века. Так что, помимо создания каталогов, нам придется поправить настройки ядра Linux. Для этого добавим следующие строки в /etc/sysctl.conf:

листинг

kernel.shmall = 2097152

kernel.shmmax = 2147483648

kernel.shmmni = 4096

kernel.sem = 250 32000 100 128

fs.file-max = 65536

net.ipv4.ip_local_port_range = 1024 65000

И запустим:

# sysctl -p

Уже подготовлена простейшая инсталляция. В промышленных масштабах рекомендуется выделять отдельный диск для файлов БД и монтировать его в /u02/. Все умные советы по установке можно найти в доке, если открыть файл welcome.htm и внимательно изучить его содержимое.

Теперь сделаем:

$ su - oracle

Затем зайдем в Disk1/ и запустим:

./runInstall -ignoreSysPrereqs

Несмотря на все заявления о поддержке Linux, инсталлятор относится к выбору дистрибутива очень избирательно, оставляя пользователям свободу выбора между последними RedHat-ами, SuSE и каким-то UnitedLinux. И хотя сначала кажется, что людям, любящим Mandrake, Debian или Gentoo, прямая дорога сосать чупа-чупс, есть способ заставить инсталлятор работать на любом дистрибутиве, что мы, собственно, и сделали - задали ключик -ignoreSysPrereqs.

Так как интерфейс у инсталлятора графический, запускать его надо под X-Window. На все задаваемые вопросы отвечаем положительно, нажимая кнопку Next. Также нас попросят запустить небольшой скриптец от рута (его название будет в выскочившем диалоге) и установить пароли для системных пользователей в базе Oracle. Пользователи, такие как system, могут при неаккуратном обращении испортить в базе данных многое, поэтому к безопасности доступа для таких функций стоит подходить с некоторым фанатизмом.

После создания базы, в самом конце нас попросят запустить еще один скрипт, чтобы завершить установку. Если для того, чтобы инсталлятор запустился, пришлось задать ключик -ignoreSysPrereqs, здесь же придется столкнуться с последствиями, то есть закомментировать пару строчек скрипта перед запуском.

Чтобы root.sh не вылетал при попытке запуска под Linux, отличным от RedHat и UnitedLinux, надо найти и закомментировать следующие две строчки:

$LNS $ID/init.cssd $rc/"$RC_START"init.cssd // { $ECHO $?; exit 1; }

$LNS $ID/init.cssd $rc/"$RC_KILL"init.cssd // { $ECHO $?; exit 1; }

В зависимости от подверсии 10g они могут находиться как рядом, так и в двух соседних циклах for/done.

Вот и все. Теперь:

# . <путь к Oracle>/root.sh

В окне инсталлятора при этом нужно нажать OK. В результате - создались все нужные файлы, Oracle стартовал, а вместе с ним запустились всяческие полезные сервисы, о которых нам бодро доложили. Но перед тем как заняться исследованием вновь установленного монстра, убедись, что умеем стартовать его вручную. Дело в том, что после первой же перезагрузки наш Oracle станет недоступен. А запустить инсталлятор с тем, чтобы он нам опять поднял базу, мы уже не сможем. Для этого познакомимся с файлом /etc/oratab, в котором определяется, какие базы данных стартуют автоматически при запуске утилиты dbstart. По умолчанию последняя строка файла выглядят следующим образом:

orcl:<путь к Oracle>:N

В последнем поле нужно поменять N на Y. Это означает, что инстанцию Oracle нужно-таки грузить. Перейдем к старту. Подготовка:

$ export ORACLE_HOME=<путь к Oracle>

$ export ORACLE_SID=orcl

$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib

$ export PATH=$PATH:$ORACLE_HOME/bin

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

Ну а теперь - непосредственно старт:

$ dbstart

$ lsnrctl start

Останавливается все следующими командами:

$ dbshut

$ lsnrctl stop

Раскидываем пользователей

За 22 года существования компании и ее основного продукта, сервера баз данных, изменилось многое. Изменились языки программирования, на которых разрабатывался софт (первая версия была написана на ассемблере). Два раза менялось название фирмы: на момент основания она называлась Software Development Laboratories, затем Rational Software Inc, после чего, наконец, - Oracle Corporation. Также добавлялись новые возможности и росли объемы продаж, но лишь одна вещь оставалась неизменной - знаменитый пользователь scott с паролем tiger. В свежеустановленной базе Oracle его не может не быть. Scott - это дань традиции, фамилия первого работника компании, Брюса Скотта (Bruce Scott), соавтора Oracle V1, V2 и V3).

У Брюса был кот, которого звали Тигром (отсюда и пароль). Не думаю, что кот этот все еще жив, скорее всего, он уже лежит в каменистой американской земле, или же днем бродит, сверкая глазищами, а по ночам грызет - людские глотки (в случае если был он похоронен на "кладбище домашних животных" из книжки Кинга).

В нынешней версии Oracle пользователь scott заблокирован. При попытке войти под ним скорее всего случится следующее:

$ sqlplus scott/tiger@orcl

SQL*Plus: Release 10.1.0.3.0 - Production on Mon Jan 10 02:55:59 2005

Copyright © 1982, 2004, Oracle. All rights reserved.

ERROR:

ORA-28000: the account is locked

Чтобы разблокировать Скотта, нам нужно будет познакомиться с командами управления пользователями. Простейший способ пообщаться с Oracle - запустить sqlplus. В ее лице мы имеем вполне традиционное средство для отсылки команд и просмотра ответов на них.

$ sqlplus system@orcl

Вводим пароль, заданный при установке, и попадаем в командную строку. Здесь пишем:

SQL> alter user scott account unlock;

User altered.

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

листинг

SQL> create user osama identified by binladen;

User created.

SQL> grant connect to osama;

Grant succeeded.

Крутим настройки

Помимо аскетичной командной строки, последняя версия Oracle включает и продвинутый графический web-интерфейс для работы с пользователями, настройками, логами и проч. Также можно смотреть загрузку системы, стартовать и останавливать инстанции, делать много всего полезного. Можно даже создать схему базы данных, особенно не вдаваясь в подробности SQL.

Называется это чудо web-интерфейсостроения так: Oracle Enterprise Manager. Чтобы им воспользоваться, нужно сделать следующее:

$ emctl start dbconsole

После чего зайти на http://имя.машины:5500/em/. Если Oracle установлен локально, то имя будет localhost. Очевидное удобство здесь в том, что с помощью того же менеджера можно рулить сервером, установленным где угодно, с той же простотой, то есть кликая мышкой и глядя на красивый GUI.

Работаем с данными: C++

Раньше, чтобы достучаться к Oracle из программы, написанной на C или C++, приходилось пользоваться OCI (Oracle Call Interface), который, хотя и был изрядно гибким, страдал главным недостатком универсальных решений - отсутствием легких путей. Требовалось вызвать как минимум пять разных функций библиотеки, чтобы сделать простой запрос к БД. Кроме этого, приходилось выделять память для множества структур, вследствие чего нередко случались утечки. Для упрощения кодинга были написаны десятки библиотек-надстроек, как для C, так и для C++. Каждый стремился написать для этого свое изделие, и в программизме под Oracle царила изрядная неразбериха.

Наконец, подумав в течение довольно продолжительного времени, ребята решили предоставить C++ разработчикам более удобный и, что немаловажно, стандартный интерфейс. Называется он OCCI. Пользоваться им просто, основы этого процесса можно понять с помощью небольшого откомментированного листинга, который лежит на нашем диске (файл - occi.txt).

Работаем с данными: PHP

Помимо C++, с базами Oracle можно работать из массы других языков программирования. API есть под все. Возьмем излюбленный инструмент web-девелопера - PHP. Тут у нас имеются три интерфейса для доступа. Это ODBC, старая (стандартная поддержка) Oracle и, наконец, самый гибкий и продвинутый интерфейс - OCI (Oracle 8 в доке). Его и рассмотрим.

Коннект:

$c = oci_connect("scott", "tiger", "orcl")

or die("cannot connect");

Вставка записи:

$s = oci_parse($c, "insert into phonebook values ('Ushat Pomoev', '765-XX-XX')");

oci_execute($s);

Выборка всех записей:

$s = oci_parse($c, "select * from phonebook");

oci_execute($s);

while(oci_fetch($s)) {

print "name: ".oci_result($s, "NAME").

"\tphone: ".oci_result($s, "PHONE")."\n";

}

Это конец:

oci_free_statement($s);

oci_close($c);

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

Работаем с данными: Java

В "Жабе" работа с любой базой данных - задача простая. Есть JDBC, а в поставке Oracle к нему имеется драйвер. Код получается таким. Для начала зарегистрируем драйвер:

DriverManager.registerDriver(new oracle.jdbc.OracleDriver());

Теперь откроем соединение:

Connection conn =

DriverManager.getConnection("jdbc:oracle:oci8:@", "scott", "tiger");

Для каждого запроса к базе данных нам нужен экземпляр класса Statement. Сделаем insert:

Statement istmt = conn.createStatement();

istmt.execute("insert into phonebook values ('Zabeg Debilov', '456-XX-XX')");

istmt.close();

Теперь select:

Statement stmt = conn.createStatement();

ResultSet rset = stmt.executeQuery("select name, phone from phonebook");

Пройдемся по курсору, пока есть результаты:

while(rset.next())

System.out.println("name: " + rset.getString(1) + "\tphone: " + rset.getString(2));

Уходя, сливаем воду и тушим свет:

rset.close();

stmt.close();

Потом закрываем соединение:

conn.close();

Компилировать и запускать его нужно предварительно добавив в CLASSPATH путь к файлу $ORACLE_HOME/jdbc/lib/classes12.zip. Все выходит более чем стандартно.

Секретное оружие джедаев

Умения и таланты Oracle поистине неисчерпаемы. Кроются они не в разработке и не в настройке этой мощной Годзиллы от баз данных. С большинством из них ты столкнешься тогда, когда начнешь изучать диалект SQL, на котором разговаривает эта СУБД. Имя ему - PL/SQL. Если ты думаешь, что на нем можно только писать запросы, то глубоко ошибаешься. В отличие от стандартного SQL, его Oracle"овый диалект - настоящий язык программирования, на котором можно писать встроенные процедуры, триггеры - обработчики, определяющие поведение базы в различных ситуациях, и многое другое. Овладевшие PL/SQL в совершенстве сдают на сертификаты по администрированию и разработке и получают серьезные бабки в крупных конторах.

Также PL/SQL - это способ доступа к уникальным функциям, отличающим Oracle от других СУБД. Дело в том, что в основу сервера баз данных положено несметное количество алгоритмов и подходов, главная цель которых сводится к обеспечению надежности и целостности данных. Для всех изменений, происходящих в базе, ведется лог, из которого можно полностью восстановить картину происходивших изменений. Благодаря такому подходу можно делать такие вещи, как, например, flashback, которая позволяет вычитывать записи из "снимка" таблицы, какой она была раньше, в определенный момент времени:

select * from table_name as of timestamp to_timestamp('дата/время', 'формат');

С помощью той же функции можно восстановить ранее прибитую командой drop таблицу со всем имевшимся на тот момент содержимым:

flashback table <удаленная.таблица> to before drop;

Оптимизатор запросов Oracle тоже совсем не детский. Принцип его действия называется cost-based (стоимостный). На основе статистики, которая собирается по таблицам и индексам, он сам строит оптимальный план выполнения запроса и решает, подключать или не подключать при этом индексы.

Также Oracle изначально приспособлен для работы в кластере. Это значит, что сервер можно "размазать" по нескольким компьютерам и не бояться того, что один из них случайно упадет, как в прямом, так и в переносном смысле.

Убить Ларри

Чтобы заработать много денег программированием, достаточно начать раньше других и постоянно совершенствовать свой продукт. Именно благодаря такой стратегии в течение многих лет Oracle считается (и является) лучшим в мире сервером баз данных. Он является стандартом, используемым в крупных корпорациях и производствах. У Oracle Corporation масса крупных клиентов. Она непотопляема. Ну а секрет успеха в бизнесе разработки софта - целеустремленность, настойчивость и талант. Пример Ларри это подтверждает.


Страница сайта http://www.interface.ru
Оригинал находится по адресу http://www.interface.ru/home.asp?artId=21729