Postanowiłem zmigrować moją aplikację służącą jako poligon na nową bazę danych. Dlaczego? Powód trywialny – chcę nabyć doświadczenie przy administracji inną bazą danych. Poza tym, podobno PostgreSQL jest całkiem dobrą bazą :) Niestety nie miałem okazji przyjrzeć jej się z bliska – czas to zmienić!

Zainstalowałem PostgreSQL w najnowszej wersji 8.3.5. Super, bazę już mam. Teraz trzeba się do niej podłączyć. Tylko jak? Google powiedziało, że jest graficzny interfejs zwiący się pgAdmin. Ściągnąłem, uruchomiłem i… No tak a jaki użytkownik i hasło? Przeglądając dokumentację trafiłem na komentarz który naświetlił mi sprawę zarządzania użytkownikami.

Po założeniu odpowiedniego użytkownika i bazy danych postanowiłem się podłączyć za pomocą wcześniej wspomnianego pgAdmina. Po kilkukrotnych próbach wpisywania loginu i hasła, które za każdym razem były odrzucane przez serwer – dałem sobie spokój.

Znów kolej na dokumentację. Dowiedziałem się dzięki niej, że jest odpowiednik komendy mysql: psql. No to uruchamiam psql – zalogowałem się. Zdziwiłem się, że nie musiałem podawać hasła. Wykonałem parę przykładowych zapytań – działa. Hmm, tylko dlaczego nie działało z pgAdminem? No nic – spróbuję zmigrować aplikację.

Pobrałem najnowszy sterownik JDBC i umieściłem go w katalogu z bibliotekami serwera JBoss ($JBOSS_HOME/server/[konfiguracja]/lib). Zmieniam dialekt Hibernate’a oraz plik *-ds.xml w którym znajdują się informacje w jaki sposób serwer ma połączyć się z bazą danych. Uruchamiam serwer – a może się uda :)

Nie, nie tym razem… Autoryzacja użytkownika nie przebiegła pomyślnie – otrzymałem komunikat: IDENT authentication failed for user "system". Długo się zastanawiałem o co chodziło z tym słówkiem IDENT, aż trafiłem na wpis w blogu który mnie oświecił :) Okazało się, że domyślnym sposobem autoryzacji jest IDENT, co oznacza autoryzację użytkowników za pomocą protokołu identyfikacji (RFC 1413). Przy logowaniu lokalnych użytkowników za pomocą gniazd, baza danych autoryzuje użytkowników automatycznie. I taka jest odpowiedź na zagadkę dlacego nie musiałem podawać hasła chcąc się dostać do psql.

Aby umożliwić logowanie za pomocą hasła należy wyedytować plik /var/lib/pgsql/data/pg_hba.conf zamieniając każde wystąpienie słowa ident na md5. Po aktualizacji należy ponownie uruchomić serwer bazy danych.

Ponowiłem próbę uruchomienia aplikacji – tym razem błędy wystąpiły przy eksporcie schematu bazy danych. Okazało się, że słowo user jest zastrzeżonym słowem kluczowym w PostgreSQL. Szybka zmiana parametru name adnotacji @javax.persistence.Column przy odpowiednich polach pomogła.

Kolejnym problem unaocznił się podczas importu przykłądowych danych. PostgreSQL używa sekwencji! Musiałem zmienić sposób generowania kluczy głównych właśnie na sekwencje. Na szczęście JPA pozwala to w dosyć prosty sposób zrobić za pomocą adnotacji @javax.persistence.GeneratedValue(strategy = javax.persistence.GenerationType.SEQUENCE), co nie zmienia faktu, że sama zmiana w wielu plikach zajęła mi trochę czasu.

Po kolejnym uruchomieniu okazało się, że zapomniałem przystosować przykładowe dane, które były importowane przy każdym uruchomieniu aplikacji na serwerze, do obsługi sekwencji. Po tej czynności aplikacja uruchomiła się poprawnie.

Podsumowanie

Czas stracony na szukaniu rozwiązań: 3 godziny, wiedza zdobyta przy okazji: bezcenna :)

About these ads