PostgreSQL - Instalacja i podstawowa konfiguracja
Transkrypt
PostgreSQL - Instalacja i podstawowa konfiguracja
PostgreSQL - Instalacja i podstawowa konfiguracja 1. Zdobywamy PostgreSQL'a 2. Kompilacja i instalacja. 2.1. Linux 3. Pierwsze uruchomienie 4. Podstawowa konfiguracja 4.1. Tworzenie nowej bazy danych 4.2. Konfigurowanie dostępu do bazy 4.3. Inne opcje 4.3.1. Opcje połączeń 4.3.2. Opcje wewnętrzne 4.3.3. Opcje logowania 1. Zdobywamy PostgreSQL'a Notatka Jako, że instalacja z rpm'ów, deb'ów oraz wszystkich innych rodzajów paczek jest bardzo prosta nie będe jej tutaj opisywał. Opis takowej instalacji jest zazwyczaj dostępny u wydawcy takowej paczki. PostreSQL'a można zdobyć z różnych źródeł. W naszym przypadku potrzebne będą źródła. Można je znaleźć na wielu CD dołączonych do różnych pism komputerowych, ale najlepiej po prostu ściągnąć je z internetu. Strona domowa projeku to http://www.postgresql.org/, tam też można pobrać najnowszą wersję bazy ( w chwili pisania artykułu 7.4, natomiast rozwojowa CVS to 7.5 ). Posługując się linkami wybieramy mirror w najkorzystniejszym dla nas miejscu ( są również i polskie ) i ściągamy bazę ( plik postgresql-x.x.x.*, jest to połączenie plików postgresql-*-x.x.x.* ). Jeżeli korzystacie z dystrybucji dla której przygotowane są już binarne paczki to polecam właśnie z nich skorzystać ze względu na późniejszą wygodę przy updatowaniu. Jeżeli nie ma paczek dla waszej dystrybujci musicie ściągnąć wersje źródłową ( .tar.gz, lub .tar.bz2 opcja mniejsza ). 2. Kompilacja i instalacja. 2.1. Linux Ostrzeżenie Osoby updatujące PostgreSQL'a powinny najpierw zrobić backup bazy. Do zrobienia kopii bazy wykonujemy komendę pg_dumpall -U admin -d -D, gdzie admin to nazwa administratora bazy ( zazwyczaj 'postgres' ). Nie zrobienie tego grozi utratą danych podczas instalacji. Jeżeli mamy już przygotowane archiwa możemy przystąpić do kompilacji i instalacji. Instalacja wymaga najpierw sprecyzowania co chcemy mieć w bazię. Wszystkie bowiem biblioteki oraz narzędzia muszą istnieć w systemie już przed http://www.php.pl Strona 1 z 7 instalacją PostgreSQL'a. Dużego wyboru dodatkowych opcji nie ma, ale mimo wszystko mamy możliwość z takich dodatkowych rozszerzeń: • • • • • • • • OpenSSL Krb 4 oraz 5 PAM Rendezvous Java ( JDBC ) Perl Python Tcl/Tk Pierwsze cztery dotyczą różnych sposobów autoryzacji, ostatnie trzy natomiast są to dodatkowe języki jakie można doinstalować do naszej bazy. Java to możliwość zbudowania sterowników do JDBC dla użycia w aplikacjach Javy. Gdy już wiemy co chcemy mieć w bazie można przystąpić do kompilacji. Najpierw trzeba rozpakować archiwa. Można to zrobić w jakimkolwiek katalogu, np. w /tmp. W takim przypadku polecenie wyglądałoby tak ( zakładając, że archiwa PostgreSQL są w aktualnym katalogu ): export TEMP_PGPATH=$PWD && cd /tmp && tar -jxf $TEMP_PGPATH/postgresql-x.x.x.tar.bz2 && unset TEMP_PGPATH. Jeżeli ściągnęliście paczkę spakowaną jako tar.gz to możecie ją rozpakować zamieniając argument -jxf na -zxf. Następnie wchodzimy do katalogu który się utworzył ( /tmp/postgresql-x-x-x ). Teraz należy przygotować Makefile do kompilacji. Zrobi to za nas skrypt configure. Przed jej uruchomieniem należy dokładnie przeczytać wynik komendy ./configure --help. Potem już możemy wydać komendę configure z właściwymi parametrami ( wcześniej mieliśmy przemyśleć co chcemy mieć w bazie - teraz właśnie możemy z tego skorzystać ). Należy jeszcze sprecyzować parametra --prefix, który jest odpowiedzialny za miejsce instalacji bazy ( osobiście polecam --prefix=/usr/local, PostgreSQL sam zadba o porządek a obsługa będzie dużo łatwiejsza, gdyż /usr/local/bin jest częścią zmiennej $PATH ). Jeżeli poleceni zwróciło błąd powtarzamy je bez argumentu, który wymagał skorzystania z jakiegoś rozszerzenia, którego brak wypatrzył PostgreSQL lub po prostu doinstalowujemy bibliotekę. Gdy już wszystko jest gotowe możemy przystąć do kompilacji. Przeprowadzamy ją poleceniem make. Jeżeli wszystko pójdzie dobrze możemy albo zbudować paczkę albo po prostu wydać polecenie make install && make install-all-headers. Teraz możemy już udać się do następnej sekcji. 3. Pierwsze uruchomienie Notatka Baza nie może być uruchamiana z identyfikatorem użytkownika ani grupy równym 0 ( root ). Notatka Ścieżka dostępu do danych bazy musi być pustym katalogiem, natomiast właściciel bazy danych musi mieć do niej wszystkie prawa. http://www.php.pl Strona 2 z 7 Podpowiedź Żeby wszystkim artykuł czytało się łatwiej, polecam na wykonać taką komendę: export PG_BINDIR=`/usr/local/bin/pg_config --bindir`, zastępując /usr/local/bin ścieżką podaliśmy przy kompilacji w argumencie --prefix z przyrostkiem /bin. Podpowiedź Umówmy się, że ścieżka dostępu do katalogu w jakim chcemy umieścić dane PostgreSQL'a zapisana jest w zmiennej $PG_DATA. W przykładach można ją albo zmienić, albo po prostu wydać polecenie export PG_DATA=/sciezka/. Zanim uruchomimy bazę musimy ją najpierw zainicjalizować. Do inicjalizacji potrzebne będą następujące informacje: • • Ścieżka do katalogu, w którym będziemy trzymali dane PostgreSQL'a. Nazwę użytkownika, który będzie administratorem, właścicielem bazy a same procesy bazy będą właśnie jego procesami. Jeżeli już mamy te informacje przygotowane możemy przystąpić do przygotowania naszej bazy do działania. Najpierw należy stworzyć wybrany katalog, możemy to zrobić poleceniem mkdir $PG_DATA. Teraz możemy zainicjować bazę. Aby tego dokonać należy zalogować się jako użytkownik wybrany do bycia właścicielem bazy. Należy teraz wydać polecenie $PG_BINDIR/initdb -D $PG_DATA. Jeżeli nie pokażą się żadne błędy, możemy przejść dalej, jeżeli natomiast i owszem, są one wystarczająco czytelne, aby sobie z nimi samemu poradzić. Nadszedł, więc odpowiedni moment na pierwsze uruchomienie. Przedstawię tutaj bardzo prosty skrypt, który odpowiednio wykorzystany może nas w tym zastąpić. #!/bin/sh export PG_DATA=/sciezka/do/bazy case $1 in start) touch /var/log/pgsql # plik z logami chmod 600 /var/log/pgsql chown postgres /var/log/pgsql su postgres -c '/usr/local/bin/pg_ctl -D $PG_DATA start /var/log/pgsql 2>&1 &' # startujemy bazę jako postgres echo 'Starting PostgreSQL deamon.' # i powiadamiamy się o tym ;) ;; > stop) su postgres -c '/usr/local/bin/pg_ctl -D $PG_DATA stop' # zatrzymujemy bazę echo 'Stopping PostgreSQL deamon.' # i powiadamiamy się o tym ;; status) su postgres -c '/usr/local/bin/pg_ctl -D $PG_DATA status' # wywołujemy status bazy http://www.php.pl Strona 3 z 7 ;; *) echo "usage: `basename $0` {start|stop|status}" >&2 # informujemy o złych parametrach exit 64 ;; esac Skrypt ten należy wyedytować (katalog oraz nazwa użytkownika) a potem umieścić w katalogu startowym naszego linuksa. Niestety każda dystrybucja używa do tego innego miejsca. Można z niego skorzystać również ręcznie. Aby rozpocząć działanie bazy wystarczy wydać komendę ./skrypt.sh start, analogicznie, do zatrzymania wystarczy ./skrypt.sh stop. Skrypt, jeżeli znajdziemy potrzebny katalog oraz umieścimy go tam będzie startował naszą bazę przy każdym starcie systemu i zatrzymywał ją przy jego wyłączeniu. Ostrzeżenie Bazy nigdy nie powinno się wyłączać poprzez polecenie kill -9, gdyż grozi to błędami i utratą danych. Można by już powiedzieć, że mamy w pełni działającą bazę danych. Notatka Aktualnie dysponujemy działającym serwerem bazy danych, do którego każdy może się połączyć przez lokalne gniazdo jako administrator do dwóch defaultowych baz - template0 oraz template1. Aby można było z niej korzystać należy dokonać jeszcze paru zadań administracyjnych. Nie jest ona jeszcze wprawdzie całkiem funkcjonalna, wystarczająco jednak, aby przesunąć się do następnej sekcji. 4. Podstawowa konfiguracja 4.1. Tworzenie nowej bazy danych Jeżeli nasz serwer już działa naprawdę powinniśmy utworzyć nową bazę danych, gdyż nie powinno się pracować żadnej z defaultowych template0/1. Możemy to zrobić na dwa sposoby, za pomocą oddzielnego narzędzia, oraz za pomocą polecenia SQL. Opiszę tutaj tylko tą drugą metodę, gdyż jest ona bardziej uniwersalna (można to zrobić również zdalnie). Najpierw musimy połączyć się z serwerem. Do tego użyjemy narzędzie dostarczanego wraz z bazą, a mianowicie psql. Najpierw musimy zalogować się jako użytkownik-właściciel bazy. Potem musimy połączyć się z bazą danych. Jako, że PostgreSQL wymaga podania bazy danych do jakiej chcemy się połączyć, a my takowej jeszcze nie posiadamy połączymy się z bazą template1. Żeby tego dokonać musimy wykonać polecenie psql -d template1. Jako, że domyślnym ustawieniem bazy jest wpuszczać wszystkich z localhost, więc od razu wejdziemy do interfejsu programu bez podawania hasła. Bazę danych stworzyć możemy komendą: http://www.php.pl Strona 4 z 7 CREATE DATABASE nazwa; Jeżeli chcemy możemy podać więcej szczegółów na temat bazy, jak właściciel, strona kodowa czy baza, z której tworzona ma dziedziczyć. Najlepiej jest stworzyć bazę o imieniu użytkownika jakim najczęściej będziemy się łączyć z bazą danych, gdyż wtedy nie będziemy musieli podawać jawnie nazwy bazy danych przy połączeniach. 4.2. Konfigurowanie dostępu do bazy Jeżeli już mamy działający serwer oraz stworzoną bazę danych to teraz przyszedł właściwy moment na ustawienie odpowiednich reguł dostępu. Jest to zadanie niezwykle ważne, ponieważ PostgreSQL ustawia domyślnie bardzo swawolne reguły dostępu. Najpierw zaczniemy od ustawienie hasła administratorowi ( którego, żebyście się nie zdziwili, wcale nie znacie - spróbujcie się dostać do psql'a z opcją -W ). Do robienia tego służy specjalne polecenie SQL ALTER USER. Najpierw łączymy się jako postgres (administrator bazy danych) do psql'a poleceniem psql -d nazwa, gdzie nazwa to nazwa bazy jaką stworzyliśmy w poprzednim podpunkcie. Teraz musimy wykonać następujące zapytanie: ALTER USER postgres WITH PASSWORD 'new_password'; W powyższym zapytaniu postgres to nazwa użytkownika administratora, a 'new_password' to hasło jakie chcemy mu nadać, oba te elementy można zmieniać. Teraz należałoby jeszcze dodać nowego użytkownika, bez uprawnień administratora, aby praca była bezpieczniejsza. Wykonamy to za pomocą następującego zapytania ( oczywiście musimy to zrobić jako administrator ): CREATE USER nazwa WITH PASSWORD 'password' NOCREATEUSER NOCREATEDB; W powyższym zapytaniu nazwa to nazwa użytkownika do stworzenia, a 'password' to hasło jakie chcemy mu nadać. Teraz już możemy się łączyć do bazy jako użytkownik, którego przed chwilą stworzyliśmy. Ale co jest? Może mu się łączyć z baza danych nie podając hasła! Odpowiada za to plik $PG_DATA/pg_hba.conf. Domyślnie wygląda on w ten sposób ( część znacząca - czyli ostatnie pare linijek ): # TYPE DATABASE USER IP-ADDRESS local all all # IPv4-style local connections: host all all 127.0.0.1 # IPv6-style local connections: host all ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff http://www.php.pl IP-MASK METHOD trust 255.255.255.255 all trust trust ::1 Strona 5 z 7 Jest to główna część odpowiadająca za dostęp do bazy. Jak widać wszystko składa się z 6 kolumn (bądź 4, jeżeli definiujemy prawa na połączeniach lokalnych). Wszystkie kolumny są oddzielone od siebie białymi znakami ( spacja lub znak tabulacji ). Pierwsza kolumna oznacza, jaki rodzaj połączeń definiujemy. Jeżeli ma wartość local, oznacza to, że definiujemy połączenie lokalne przez UNIKsowe gniazda, jeżeli natomiast ma wartość host, oznacza to, że definiujemy połączenie przez protokół tcp/ip. Jest jeszcze jedna możliwość ( dla bardziej zaawansowanych zastosowań ), a mianowicie hostssl, która oznacza, że połączenia z tego hosta muszą być kodowane. Druga i trzecia kolumna oznaczają odpowiednio nazwę bazy danych oraz użytkownika, dla którego definiujemy połączenie. Czwarta i piąta kolumna ( ważne tylko jeżeli definiujemy połączenie typu host lub hostssl ) oznaczają adres IP oraz maskę z jakich połączenia mają przychodzić połączenia. Ostatnia kolumna ( najważniejsza ) mówi w jaki sposób użytkownik ma być autoryzowany. Główne i najczęściej używane opcje to trust, password oraz md5. Pierwsza oznacza, że wogóle nie trzeba podawać hasła, druga mówi o konieczności podania hasła w postaci text/plain a trzecie, że powinno ono być zakodowane przez md5. W sumie dobrym rozwiązaniem jest ustawienie tego pliku w taki sposób: # TYPE DATABASE USER IP-ADDRESS IP-MASK local all password # IPv4-style local connections: host all all 127.0.0.1 password # IPv6-style local connections: host all all ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff password METHOD all 255.255.255.255 ::1 Musimy jeszcze zrestartować bazę, wykonamy to poleceniem pg_ctl -D $PG_DATA restart, gdzie oczywiście musimy zmienić ścieżkę dostępu na tą, którą podaliśmy w naszym systemie. Teraz już możemy się zalogować do bazy jako ktokolwiek. Powinniśmy zobaczyć ładną zachętę do wpisania hasła. 4.3. Inne opcje Głównym plikiem konfiguracyjnym bazy jest plik $PG_DATA/postgresql.conf. Są tam przechowywane praktycznie wszystkie dane temat zachowania naszej bazy. Bardzo dobry opis dostępnych tutaj opcji znajduje się na stronie http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.html. Nie będę tutaj tworzył aż tak dokładnego opisu, gdyż nie na tym istota tego artykułu polega, dla osób stawiających jednak komercyjny serwer polecam przyjrzeć się tamtej stronie. http://www.php.pl Strona 6 z 7 4.3.1. Opcje połączeń Opcje tutaj opisane służą do regulowania możliwości/parametrów połączenia się z bazą. Jest tutaj stosunkowo niewiele, aczkolwiek stosunkowo ważnych opcji. • tcpip_socket Opcja może mieć wartość true albo false. Mówi, czy powinna być możliwość dostępu do bazy z sieci ( według reguł zdefinowanych w sekcji 4.2 ), czy też nie. Jeżeli możliwe są tylko połączenia przez sockety lokalne. • max_connections Opcja okresla maksymalną liczbę połączeń jakie mogą być nawiązane z bazą w jednym czasie. • superuser_reserver_connections Opcja określa, ile połączeń powinno pozostać wolnych dla superużytkoniwka ( administratora ). Oznacza ona, że połączeń dla zwykłych użytkowników jest liczba zdefiniowana powyżej minus liczba połączeń zarezerwowanych dla superużytkownika. W praktyce przy większości wystarcza jedno. • port Oznacza na jakim porcie ma nasłuchiwać baza. Jeżeli tcpip_socket jest ustawiony na false to opcja jest ignorowana. • authentication_timeout Określa liczbę sekund ( 1 - 600 ), jaka może maksymalnie upłynąć gdy baza oczekuje na autoryzacje nowo nawiązanego połączenia. Są to najważniejsze opcje w tej dziedzinie. Wraz z dobrym ustawieniem opcji omawianych w sekcji 4.2 oraz dobrym ustawieniem uprawnień w samej bazie ( nie omawiane w tym artykule ) można osiągnąć naprawdę wysoki poziom bezpieczeństwa. 4.3.2. Opcje wewnętrzne 4.3.3. Opcje logowania http://www.php.pl Strona 7 z 7