Rajmund Radziewicz
Instalacja i konfiguracja serwera baz danych Oracle 9i na Linuksie (dystrybucje RHEL/CentOS i Debian Sarge)

Wstęp

Firma Oracle, IBM, Sun Microsystems, czy też Novell - od lat wspierają projekty OpenSource i rozwój samego Linuksa. Można wręcz powiedzieć, że symbioza dużych korporacji i środowiska związanego z rozwojem Wolnego Oprogramowania daje obopólne korzyści. Aby wypróbować Oracle'a, możemy ze strony http://www.oracle.com/ pobrać pełne wersje oprogramowania, które do celów testowo-edukacyjnych dostępne jest bezpłatnie (na zasadach tzw. Development License). Warto wspomnieć, że jest to system relacyjno-obiektowych baz danych, doskonale zintegrowany z systemami linuksowymi, czy też uniksowymi - wyróżniający się m.in. takimi rozwiązaniami jak:

  • Wbudowane języki proceduralne (PL/SQL)
  • Rozbudowane narzędzia administracyjne, analityczne i raportowe
  • RAC (Real Application Clusters) - technika klastrowania systemów bazodanowych
  • VPD (Virtual Private Database) - kontrola dostępu do danych na poziomie wierszy
  • Data Mining - zestaw narzędzi do zaawansowanych eksploracji danych, wykorzystywanych m.in przy projektowaniu hurtowni (dużych, rozproszonych baz przechowujących dane historyczne)
  • Flashback Query - możliwość wycofywania błędnych modyfikacji (poleceń typu: update, delete, drop)

Instalacja serwera Oracle 9i na platformie Linux - z racji silnej integracji środowiska bazy danych z systemem operacyjnym - wymaga wykonania szeregu czynności przygotowawczych. Głównie mają one na celu poprawę wydajności instalowanego oprogramowania, konfigurację zmiennych środowiskowych oraz zdefiniowanie odpowiednich uprawnień.

Warto przy tej okazji wspomnieć o pewnej specyfice działania Oracle'a na systemach z rodziny Linux/Unix. Polega ona głównie na tym - że na wspomnianych platformach praca serwera baz danych opiera się na modelu procesowym (w przeciwieństwie do wątkowego modelu, w jakim Oracle pracuje np. na Windows). Oznacza to mniej więcej tyle - że na  Linuksie zadania takie jak zapisywanie do bazy, monitory usług, czy obsługa połączeń klienta działają jako oddzielne procesy. W Windows wszystkie te zadania pracują jako wątki jednego procesu. Stanowi to pewną niedogodność, ponieważ wątki dzielą tę samą przestrzeń adresową pomiędzy całą pulę dostępnej dla bazy pamięci. W przypadku bardzo obciążających zadań (repliki, sortowanie), na platformie Windows może więc występować problem z dostępną w danej chwili pamięcią RAM w ramach pojedynczego wątku. Tego typu niuanse powodują właśnie, że połączenie oprogramowania takiego jak Oracle z systemem uniksowym (w kontekście tego tekstu z Linuksem) - szczególnie przy słabszej maszynie, pozwala na dokładniejsze wykorzystanie zasobów sprzętowych i programowych. Jako że dochodzi do tego możliwość zmiany ustawień jądra systemu operacyjnego - łatwiej jest również precyzyjnie dostrajać wydajność oprogramowania.

Odpowiednią dystrybucją Linuksa na potrzeby serwera baz danych, może być np. CentOS 4.1 (http://www.centos.org). Jest to system dostępny na licencji GPL i w pełni zgodny z komercyjnym obecnie RedHat Enterprise Linux 4 (RHEL). Instalując go otrzymujemy także możliwość dokonywania wszelkich aktualizacji oprogramowania bezpośrednio poprzez sieć (za pomocą usługi CentOS Network). Jest to o tyle istotne, że do RHEL trafiają w zasadzie dobrze przetestowane i dobrane komponenty. Fundacja CAOS zajmująca się rozwojem CentOS'a, stawia sobie za cel dostarczanie alternatywnej dystrybucji Linuksa, zgodnej binarnie z enterprisowym produktem firmy RedHat i w pełni bezpłatnej. Sam system jest po prostu kompilacją pakietów źródłowych RHEL (src.rpm) jakie zgodnie ze wspomnianą licencją firma RedHat musi udostępniać w sieci. Wszelkie aktualizacje publikowane dla RHEL są też po niedługim czasie dostępne w repozytoriach CentOS'a. Jeśli komuś wydaje się dziwne takie zjawisko, powinien zapoznać się z licencją GPL (http://www.gnu.org) na jakiej udostępniane jest jądro Linuksa i większość dostarczanych z nim aplikacji.
Oracle oficjalnie supportuje RedHata i Suse - stąd CentOS może okazać się tutaj naturalnym wyborem. Niezbyt zalecaną dystrybucją jest Fedora, która służy w zasadzie jako poligon doświadczalny dla RHEL i kolejne jej wersje nafaszerowane są technicznymi nowinkami, często jednak działającymi niestabilnie (to co sprawdzi się w Fedorze i zostanie przetestowane przez jej użytkowników - przenoszone jest do wspomnianego RHEL). Oczywiście nie musimy ograniczać się wyłącznie do RedHata, Suse, czy pochodnych. Możemy zainstalować również serwer baz danych np. na Debianie - i instalację Oracle'a na tej właśnie dystrybucji opiszę pod koniec tego artykułu.


Konfiguracja przedinstalacyjna

Kluczem do wydajnej i prawidłowej pracy Oracle'a na Linuksie jest odpowiednia konfiguracja określonych obszarów systemu operacyjnego. W zasadzie jest ona niezbędna, jeśli chcemy - żeby instalacja serwera baz danych w ogóle się powiodła. W pierwszej kolejności powinniśmy sprawdzić, czy posiadamy wymagane przez bazę pakiety RPM, takie jak kompilatory, czy też biblioteki systemowe. W przypadku RHEL 4 lub CentOS 4.1 wszystkie potrzebne komponenty znajdują się na płytach instalacyjnych. Za pomocą polecenia "rpm -q" możemy odpytać system, czy mamy już zainstalowane to co potrzeba:

# rpm -q make     \
       compat-db    \
       compat-gcc-32  \
       compat-gcc-32-c++    \
       compat-libgcc-296      \
       compat-libstdc++-296    \
       compat-libstdc++-33    \
       gcc    \
       gcc-c++   \
       libaio-devel     \
       libaio      \
       make    \
       openmotif21  \
       xorg-x11-deprecated-libs-devel 

Polecenia wykonujemy cały czas jako użytkownik root. Żeby sobie ułatwić - możemy po prostu skopiować zawartość powyższej ramki do terminala (pomijając rzecz jasna znak "#", który oznacza powłokę roota i pamiętając o znakach "\"). Po wykonaniu tej komendy system wylistuje nam odpowiednie paczki RPM, wyświetlając komunikat: "pakiet X nie jest zainstalowany", jeśli czegokolwiek zabraknie. Gdyby okazało się, że musimy coś doinstalować - możemy posłużyć się menadżerem pakietów rpm (rpm -Uvh brakujący_pakiet.rpm) lub aplikacją yum, która potrafi pobierać binarki bezpośrednio z sieciowych repozytoriów CentOS'a. Jeśli więc chcielibyśmy doinstalować np. kompilator gcc-c++, wystarczy skonfigurować połączenie z Internetem i wpisać w terminalu polecenie:

# yum install gcc-c++

Oczywiście jeśli mamy wszystkie płyty instalacyjne RHEL lub CentOS, nie ma potrzeby pobierać niczego z sieci. Właściwą konfigurację zaczynamy od utworzenia dedykowanego dla Oracle'a użytkownika systemowego oraz odpowiednich grup. Nie jest zalecane aby serwer był instalowany lub działał z uprawnieniami root'a:
# groupadd dba
# groupadd oinstall
# useradd -c "Oracle" -g oinstall -G dba oracle

Następnie dla nowego użytkownika "oracle" ustawiamy hasło:

# passwd oracle

Teraz pobrane z http://www.oracle.com/ pliki instalacyjne Oracle'a 9i (najnowsza dostępna wersja z serii 9i to 9.2.0.4) przenosimy do /opt/ i rozpakowujemy:

# mv ship_9204_linux* /opt/
# zcat ship_9204_linux_disk1.cpio.gz | cpio -idmv
# zcat ship_9204_linux_disk2.cpio.gz | cpio -idmv
# zcat ship_9204_linux_disk3.cpio.gz | cpio -idmv

Po wykonaniu powyższych poleceń utworzone zostaną trzy katalogi: Disk1, Disk2 i Disk3, w których znajdzie się zawartość pobranych archiwów. 

Teraz powinniśmy utworzyć katalog instalacyjny dla serwera baz danych:

# mkdir -p /u01/app/oracle/product/9.2.0

Parametr "-p" przy mkdir oznacza, że system utworzy jednocześnie wszystkie wymagane podkatalogi. W przeciwnym wypadku musielibyśmy tworzyć oddzielnie /u01/, a w nim /app/, /oracle/ itd. Po utworzeniu katalogu należy zmienić jego właściciela oraz nadać mu odpowiednie prawa:

# chown -R oracle.oinstall /u01
# chmod -R 755 /u01
# chown -R oracle.oinstall /opt/Disk*

W tej chwili zarówno /u01 z całą zawartością, jak i /opt/Disk1, /opt/Disk2 oraz /opt/Disk3 należą do użytkownika "oracle" i grupy "oinstall".

Teraz pozostała konfiguracja zmiennych środowiskowych powłoki i parametrów jądra. W Linuksie i innych systemach uniksowych, w których zainstalowana jest powłoka bash, odpowiednie zmienne i ustawienia przechowywane są w pliku /home/użytkownik/.bash_profile. Kropka poprzedzająca nazwę pliku oznacza, że jest on ukryty. W naszym wypadku edytujemy /home/oracle/.bash_history i dopisujemy na jego końcu:

export LD_ASSUME_KERNEL=2.4.19  
# zmienne środowiskowe Oracle'a
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/9.2.0
export ORACLE_SID=oratest
export ORACLE_TERM=xterm
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
export LD_LIBRARY_PATH
# ścieżka
export PATH=$PATH:$ORACLE_HOME/bin

Wpis LD_ASSUME_KERNEL=2.4.19 oznacza, że system będzie poprawnie obsługiwał pliki binarne dedykowane dla starszych wersji jądra (nie wszystkie komponenty Oracle'a były tworzone z myślą o jądrach z serii 2.6, w jakie wyposażone są nowe dystrybucje Linuksa). Pozostałe parametry wskazują na lokalizację katalogów w których zostanie zainstalowana baza, SID, ścieżkę do bibliotek itp.

Po tej operacji, musimy ustawić jeszcze parametry jądra, jakich wymaga instancja (pliki + procesy) bazy danych. Najprościej zrobić to, dopisując do pliku /etc/sysctl.conf poniższą sekcję:

kernel.sem = 250 32000 100 128
kernel.shmall = 2097152
kernel.shmmax = 536870912
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000

Wpis "kernel.sem" oznacza liczbę semaforów (semafor to taki sprytny mechanizm w jądrze Linuksa, synchronizujący działanie procesów). Najważniejszy jest jednak parametr "kernel.shmmax", który określa maksymalny rozmiar tzw. segmentu wyrażony w bitach (w jego obrębie będzie pracował oracle'owy SGA (System Global Area), który jest wydzielonym dla bazy fragmentem pamięci. Wielkość segmentu jest oczywiście uzależniona od ilości pamięci operacyjnej w jaką wyposażony jest nasz komputer. Po uzupełnieniu pliku /etc/sysctl.conf - możemy "zmusić" jądro systemu, żeby wczytało dopisane parametry bez potrzeby restartu komputera. Wystarczy w tym celu polecenie:

# sysctl -p

Na koniec powinniśmy zainstalować łatkę (dokładnie p4198954_21_LINUX.zip), jaką Oracle wypuścił ostatnio dla RHEL 4 (tym samym i dla CentOS 4.1) oraz zgodnych z tymi systemami dystrybucji. Zawiera ona dwa pakiety RPM i można ją pobrać ze strony http://metalink.oracle.com. Jeśli nie mamy czasu na poszukiwania - możemy z poniższych lokalizacji ściągnąć wspomniane RPM'y bezpośrednio: 

Paczki instalujemy za pomocą polecenia: "rpm -Uvh pakiet1.rpm pakiet2.rpm". Są one niezbędne - jeśli chcemy, żeby instalator bazy danych się uruchomił. Obydwie wymagają również pakietu xorg-x11-deprecated-libs-devel (to ten z listy niezbędnych komponentów, których weryfikację opisywałem na początku).

Ok. W tym momencie system jest gotowy do rozpoczęcia instalacji oracle'owego serwera i reszty "zabawek".

Instalacja

Minimalne wymagania dotyczące instalacji Oracle 9i wynoszą wg oficjalnej dokumentacji 512 MB RAM oraz 1 GB przestrzeni dyskowej. Jeśli jednak nie planujemy używać pamięciożernych narzędzi typu Oracle Data Mining, przeznaczonych na potrzeby hurtowni - komputer z 256 MB RAM pozwala na całkiem przyzwoitą pracę z serwerem. Znaczenie ma tu oczywiście również ilość danych, jakimi zamierzamy zapełniać nasze bazy. Istotne jest także wyłączenie wszystkich zbędnych usług systemowych, uruchomionych wraz ze startem Linuksa i działających w tle (tzw. demonów). Część z nich zapewne nie jest nam potrzebna - natomiast potrzebna może się okazać pamięć jaką zużywają (mam tu na myśli serwer pocztowy sendmail, usługi związane z sieciowym systemem plików: nfs, nfs-lock itp). Należy pamiętać również o tym, że jeśli podczas instalacji wybierzemy opcję "Enterprise Edition" lub "Standard Edition" - minimalną wymaganą przestrzenią dyskową będzie 2,5 GB.

Instalator bazy Oracle (OUI - Oracle Universal Installer) to javowa, graficzna aplikacja, uruchamiana z katalogu Disk1 poleceniem:

# ./runInstaller

W przypadku kiedy nie mamy oficjalnie supportowanej dystrybucji Linuksa - instalator nie chce się jednak uruchamiać. Weryfikuje podczas startu plik /etc/redhat_release i sprawdza, czy znajdzie tam stosowny wpis (czyli "Redhat-3", "Redhat-4" itp). Jeśli napotka coś w stylu "Fedora, "CentOS" lub pliku w ogóle nie znajdzie - bo instalujemy przykładowo bazę na Debianie - nie ma mowy o uruchomieniu instalacji. Prostym i powszechnie stosowanym zabiegiem jest więc podmiana zawartości redhat_release. Wystarczy w tym celu komenda:

# echo 'redhat-4' > /etc/redhat-release

Następnie logujemy się na konto użytkownika oracle. Wchodzimy do katalogu /opt/Disk1 i uruchamiamy instalator wspomnianym: ./runInstaller. Pojawi się ekran startowy, na którym wystarczy kliknąć "Next":

ora1

Następnie określamy lokalizację katalogu Inventory - w którym znajdą się informacje o zainstalowanych produktach oraz dane na temat środowiska Oracle. Jeśli poprawnie ustawiliśmy parametry w pliku /home/oracle/.bash_profile - instalator sam uzupełni właściwą ścieżkę i wyświetli: /u01/app/oracle/oraInventory:

ora2

Krok następny to ustalenie nazwy grupy użytkowników. Wpisujemy założoną podczas konfiguracji "oinstall":

ora3 

Po zdefiniowaniu grupy - instalator wyświetli komunikat o konieczności wykonania z poziomu terminala skryptu orainstRoot.sh.  Jest to konieczne ponieważ pracujemy w tej chwili jako użytkownik oracle -  a skrypt modyfikuje uprawnienia do założonych przed chwilą katalogów instalacyjnych:

ora4

Żeby wymagany skrypt wykonać - powinniśmy otworzyć nowe okno terminala i wpisać w nim:

su -
# /tmp/orainstRoot.sh

Po wpisaniu "su -" zostaniemy zapytani o hasło użytkownika root, a znak prompt zmieni się w charakterystyczny "#". Jeśli skrypt wykona się poprawnie - klikamy na "Continue" i przechodzimy do kolejnego etapu instalacji. Teraz musimy wskazać na katalog, w którym mają się znaleźć pliki bazy danych. Jest to nic innego - jak zawartość zmiennej $ORACLE_HOME, jaką definiowaliśmy wcześniej pliku .bash_profile:

ora5

Następnie zaznaczamy produkt, który chcemy zainstalować (domyślnie Oracle 9i Database 9.2.0.4.0). Do wyboru mamy również samego klienta, narzędzia do zarządzania klastrami i do integracji usług sieciowych

ora8

W kolejnym oknie definiujemy typ instalacji. Do wyboru mamy "Enterprise Edition", "Standard Edition" i "Custom". Edycja enterprisowa zajmuje trochę ponad 2,5 GB oraz zawiera narzędzia do eksploracji danych(tzw: Data Mining) wykorzystywane najczęściej w hurtowniach. Jeśli nie planujemy projektować hurtowni danych, w zupełności wystarczy opcja "Standard Edition".

ora9

Po wybraniu preferowanego typu, instalator weryfikuje konfigurację naszego systemu operacyjnego. O ile nie znajdzie żadnych błędów, wyświetla okno podsumowania. Klikamy "Continue" i przechodzimy dalej. Następne okno to konfiguracja testowej bazy danych. Wybieramy opcję "General Purpose":

ora10

W tej chwili będziemy musieli ustawić nazwę naszej bazy oraz SID (System Identifier), który jest unikalnym identyfikatorem instancji. Przechodzimy dalej i na następnym ekranie określamy miejsce, w którym chcemy przechowywać pliki danych. W przypadku opisywanej tu konfiguracji będzie to /u01/app/oracle/oradata. Po kliknięciu "Next" przechodzimy do ustawienia kodowania znaków w bazie. Jeśli korzystamy z utf8 - zalecaną opcją jest AL32UTF8.

o13

Na koniec podsumowanie wszystkich ustawień instalacyjnych:

ora14

Oraz instalacja:

o16

Pod koniec procesu instalacyjnego musimy uruchomić kolejny skrypt z prawami użytkownika root. Otwieramy więc okno terminala i analogicznie jak poprzednim razem, wykonujemy /u01/app/oracle/product/9.2.0/root.sh:

o18

Chwilę później uruchomi się tzw: "Database Configuration Assistant", który utworzy zdefiniowaną wcześniej bazę testową:

o19

Po jej utworzeniu musimy ustawić hasła dla użytkowników SYS oraz SYSTEM.

o21

Na koniec wyświetli się nam okno informujące o zakończeniu instalacji. Wciskamy "Exit", potwierdzamy zamknięcie instalatora ... i rozpoczynamy pracę z bazą danych.

Czynności poinstalacyjne

Po instalacji Oracle'a możemy połączyć się do nie zamontowanej jeszcze instancji i uruchomić serwer z lokalnego konta sysdba (bez podawania hasła):

oracle$ sqlplus /nolog
SQL> connect /as sysdba
SQL> startup

Następnie powinniśmy uruchomić proces Listenera:

Oracle$ lsnrctl start

Oracle Listener jest komponentem odpowiedzialnym za komunikację pomiędzy serwerem baz danych a klientami. Nasłuchuje standardowo na porcie TCP 1521.
Teraz możemy zalogować się do założonej podczas instalacji testowej bazy "oratest" oraz założyć nowego użytkownika

o403

Oczywiście poza SQL*Plus możemy posłużyć się również konsolą Enterprise Managera. Jest to narzędzie służące do administracji i zarządzania bazą danych (a także całą instancją Oracle'a). W celu uruchomienia konsoli wpisujemy w terminalu polecenie: 

Oracle$ oemapp console

Po uruchomieniu aplikacji, należy kliknąć prawym klawiszem na identyfikator bazy danych znajdujący się na liście w lewym panelu (w naszym przypadku jest to "oratest") i wybrać z menu pozycję "Connect":

oem

Po poprawnej autoryzacji, możemy zweryfikować np. w jaki sposób OEM prezentuje dane założonego przez nas przed chwilą użytkownika:

użytkownik

Jeśli chcemy zamknąć bazę danych - powinniśmy połączyć się z nią jako sysdba i wykonać polecenie: shutdown:

Oracle$ sqlplus /nolog
SQL> connect /as sysdba
SQL> shutdown

Przed wyłączeniem bazy muszą być zamknięte wszystkie nawiązane wcześniej połączenia użytkowników. Jeśli chcemy żeby Oracle nie czekał na zakończenie sesji - możemy posłużyć się poleceniem "shutdown immediate".


Instalacja Oracle'a na Debianie Sarge

    Pomimo, że oficjalnie Oracle nie supportuje Debiana (nie jest to komercyjna dystrybucja) - z powodu wysokiej jakości pakietów *.deb i możliwości administracyjnych jakie daje sam system, warto pokusić się o uruchomienie serwera Oracle 9i właśnie na tej odmianie Linuksa. 

Większość zadań konfiguracyjnych wykonuje się analogicznie jak w RedHat/CentOS, są natomiast pewne drobne różnice. Podczas zakładania grup i użytkownika "oracle", należy posłużyć się poleceniem "adduser", za którego pomocą dodajemy użytkownika - i następnie przypisujemy go do grup "dba" oraz "oinstall":

# groupadd dba
# groupadd oinstall
# adduser oracle
# adduser oracle dba
# adduser oracle oinstall

Istotne jest również, aby pamiętać o wymaganych pakietach DEB. Są to: binutils, lesstif oraz libstdc++2.10-glibc2.2. W razie potrzeby możemy w/w doinstalować za pomocą apt-get'a:

# apt-get update
# apt-get install binutils lesstif libstdc++2.10-glibc2.2

Domyślnie w Debianie Sarge instaluje się komilator GCC w wersji 3.35. Bardzo ważne jest, żeby doinstalować na potrzeby Oracle'a starszą wersję tego komilatora:

# apt-get install gcc-2.95

Oraz zrobić serię dowiązań do niezbędnych bibliotek, odpowiedniej wersji GCC, utworzyć plik oratab z odpowiednimi uprawnieniami itp:

# rm -f /usr/bin/gcc
# ln -s /usr/bin/gcc-2.95 /usr/bin/gcc
# ln -s /usr/bin/basename /bin/basename
# ln -s /usr/bin/awk /bin/awk
# cd /usr/lib
# ln -s libstdc++-libc6.2-2.so.3 libstdc++-libc6.1-1.so.2
# touch /etc/oratab
# chown oracle.oracle /etc/oratab
# chmod uog+rw /etc/oratab

Jeśli pod koniec instalacji serwera, w oknie "Configuration Tools" - przy opcji: "Oracle Database Configuration Assistant" otrzymamy błąd:

--------------------------------------------------------------------------------------

SIGSEGV   11*  segmentation violation
        stackbase=0x453da000, stackpointer=0x453d9d5c
Full thread dump:
    "AWT-EventQueue-0" (TID:0x411d1e20, sys_thread_t:0x453d9e0c,
state:R) prio=5 *current thread*
        java.lang.Object.wait(Object.java)
        java.awt.EventQueue.getNextEvent(EventQueue.java:126)
--------------------------------------------------------------------------------------

.. powinniśmy otworzyć terminal i wykonać następujące polecenie (jako użytkownik root):

$ su - root
touch /etc/rac_on

Teraz przy opcji "Oracle Database Configuration Assistant" w oknie instalatora wciskamu przycisk "Retry" i tym razem konfiguracja testowej bazy powinna przebiec bez żadnych problemów.