niedziela, 27 stycznia 2013

UTL_HTTP polskie znaki

Ostatnio dosyć intensywnie eksloatowałem pakiet UTL_HTTP. Pojawił się problem z dziwnym konwertowaniem polskich znaków na jakieś krzaki.  Wynika to z ustawień samego pakietu. Krzaki pojawiały się już w tekście zwracanym przez funkcję:

utl_http.request_pieces(link);

która zwraca tablicę elementów tekstowych.  Jakie masz domyślne kodowanie możesz sprawdzić metodą:

utl_http.get_body_charset(x);

gdzie x to parametr tekstowy typu OUT. Aby znaki pojawiły się we właściwym kodowaniu , wywołujemy funkcję:

utl_http.set_body_charset('UTF8');


jeszcze przed wywołaniem utl_http.request_pieces(link);

niedziela, 20 stycznia 2013

Gotuj z Oracle'm : Odtworzenie bazy w innym miejscu z backupu

Tutaj macie instrukcję jak w (prawie) bezbolesny sposób skopiować sobie bazę danych Oracle na inny serwer.  Warto zadbać o to, by zarówno serwer źródłowy  jak i docelowy miały tą samą wersję. Dzięki temu nie powinny się pojawić żadne zgrzyty.  Oczywiście baza źródłowa powinna mieć włączony tryb ARCHIVELOG.

Part I  - wykonanie kopii zapasowej i skopiowanie danych

W pierwszej kolejności najlepiej będzie wykonać sobie pełen skompresowany backup. Zanim jednak go wykonasz , zaloguj się do RMANa i wydaj tą komendę:

CONFIGURE CONTROLFILE AUTOBACKUP ON;

Sprawi ona, że po wykonaniu backupu (nie tylko wtedy) zostanie wykonany automatycznie backup pliku kontrolnego.

Po niej wykonaj skompresowany backup całej bazy danych (też z RMANa):

BACKUP AS COMPRESSED BACKUPSET DATABASE;

Wejdź teraz do swojego FRA. Jeśli nie wiesz gdzie się znajduje , to z poziomu sqlplusa wydaj polecenie:

SHOW PARAMETER DB_RECOVERY_FILE_DEST;

W katalogu który pokaże Ci się w wyniku działania powyższego polecenia znajdziesz podkatalog o nazwie takiej jak SID bazy danych którą kopiujesz. Wejdź w ten katalog. Powinieneś mieć w nim podkatalogi:
Backupset, Archivelog, Autobackup i Onlinelog. Skopiuj sobie cały katalog "autobackup" do FRA bazy docelowej. Tam również powinna być zachowana struktura katalogów: "SID_bazy/Autobackup" . Backup który przed momentem wykonałeś znajdziesz w katalogu backupset (w podkatalogu z dzisiejszą datą).   Skopiuj plik właśnie wykonanego backupu do dowolnego podkatalogu na dysku serwera docelowego.

Part II - Ustawianie ścieżek

Ponieważ położenie plików kontrolnych może być różne w bazie źródłowej i docelowej, a nawet system operacyjny może być inny, trzeba będzie poprzestawiać ścieżki.  W pierwszej kolejności z bazy docelowej wypluj sobie na dysk plik PFILE (z poziomu sqlplusa):

CREATE PFILE = ' C:\PFILE.TXT' FROM SPFILE;


Wyedytuj do i odnajdź parametr "control_files". Określa on gdzie system będzie szukał plików kontrolnych. W pierwszym etapie uruchomienia  (tj. przejściu do trybu NOMOUNT) system podpina sobie spfile lub pfile (plik z parametrami startowymi) , alokuje pamięć i czyta parametry. Parametr control_files będzie mu potrzebny do przejścia do trybu MOUNT , gdzie pliki kontrolne będą mu juz potrzebne.  Jeśli w bazie docelowej pliki kontrolne mają się znaleźć gdzie indziej , lub nie ma takiej struktury katalogów jak określona w parametrze - popraw go.
Odnajdź teraz w tym samym pliku parametr db_recovery_file_dest i popraw ścieżkę na tą obowiązującą w bazie docelowej. Tam właśnie system będzie szukał podkatalogu z sidem bazy, a w nim katalogu AUTOBACKUP, więc ważne jest byś jednak to zrobił....
Jeśli zależy Ci na zachowaniu parametrów startowych z bazy źródłowej, takich jak ustawienia SGA, możesz skopiować sobie plik pfile z bazy źródłowej i to na nim nanieść poprawki.

Part III - stawianie bazy

Na ten moment powinieneś mieć skopiowany katalog AUTOBACKUP i plik backupu z bazy źródłowej do docelowej, oraz poprawione parametry w pliku PFILE. Jeśli którejś z tych rzeczy nie masz, to znaczy że troszkę za bardzo się śpieszysz i powinieneś jeszcze raz przejrzeć wcześniejszą treść artykułu.
Zaloguj się do bazy docelowej i z poziomu sqplusa ją połóż:

SHUTDOWN IMMEDIATE;

Następnie podnieś ją do trybu nomount z użyciem pliku pfile zamiast spfile:

STARTUP PFILE='C:\PFILE.TXT' NOMOUNT;

Jesteś teraz w trybie nomount , ale pliki kontrolne oraz pliki danych w bazie docelowej pozostają stare. To jest właściwy tryb do podmiany pliku kontrolnego na ten pochodzący z bazy źródłowej, dlatego przechodzisz do RMANa i wydajesz polecenie takie:

RESTORE CONTROLFILE FROM AUTOBACKUP;

 Plik kontrolny jest już podmieniony na nowy, ale pliki danych są nadal stare. Trzeba teraz podmienić na te, z bazy źródłowej. Niezbędne będzie więc odtworzenie backupu (który już powinien znajdować się w FRA) bazy źródłowej. Do tego procesu potrzebna będzie informacja na temat tego gdzie pliki backupu się znajdują, a ta znajduje się w repozytorium które z kolei znajduje się w pliku kontrolnym który przecież nie jest podpięty do systemu (właśnie go podmieniliśmy). Dlatego właśnie powinieneś wydać komendę (możesz wykonać ją z RMANa):

ALTER DATABASE MOUNT;

Wszystkie kolejne polecenia wykonujemy już z RMANa. Ponieważ plik kontrolny pochodzi ze starej bazy, to i ścieżki do plików backupu będą stare. Trzeba więc zaprowadzić jakiś porządek aby system szukał backupów tam gdzie powinien. Wydaj więc komendy:

CROSSCHECK BACKUP;
DELETE EXPIRED BACKUP;

Dzięki tym komendom system sprawdzi czy położenie plików backupów wg. repozytorium pokrywa się z fizycznym położeniem plików. Jeśli tam ich nie znajdzie, to informacje o nich wywali z repozytorium. Właśnie o to nam chodzi. System ma szukać w nowym miejscu, czyli tam gdzie zrzuciliśmy plik backupu pochodzący z bazy źródłowej. Aby wiedział że ten backup się tam znajduje powinieneś wydać polecenie:

CATALOG START WITH 'C:\ŚCIEŻKA_DO_KATALOGU_GDZIE_WRZUCIŁEŚ_BACKUP';

 Na ten moment system już wie, gdzie znajduje się backup do odtworzenia , plik kontrolny już został podmieniony na pochodzący z bazy źródłowej. Pozostaje nam więc odtworzenie  bazy:

RESTORE DATABASE;

I otwarcie jej:

ALTER DATABASE OPEN RESETLOGS;

Koniec. Stan bazy docelowej będzie stanem bazy źródłowej z momentu wykonania backupu. Enjoy!