sobota, 29 stycznia 2011

RMAN - Kopie zapasowe w Oracle

W życiu każdego admina Oracle przychodzi taki moment, kiedy trzeba wykonać kopię zapasową bazy. Ponieważ w necie brakuje jako takiego kursu omawiającego nieco więcej niż podstawowy backup i przywracanie, postanowiłem napisać własny. Możecie też zamiast czytać ten kurs iść na szkolenie do Oracle za jakieś ~3-4 tyś (jeśli akurat taka drobna sumka wala Wam się po kieszeniach :P ) . Nie każdego na to stać, więc ... macie tutaj prawie to samo tylko za free :)

Podstawowe informacje i wstępna konfiguracja

Backupy możecie wykonywać na dwa sposoby
- wyłączając bazę i kopiując fizyczne pliki (tzw. zimny backup)
- wykorzystując rmana i zrobić backup bez wyłączania bazy (hot backup)

Z oczywistych względów lepszy jest ten drugi i nie będę się tu wdawał w demagogię na temat przerywania pracy użytkownikom i setkom telefonów wkurzonych userów do naszej admin-kanciapy.

adin - żeby wykonać gorący backup trzeba ustawić bazę w tryb archivelog. Po tym zabiegu pliki dzienników powtórzeń przed nadpisaniem zostaną zarchiwizowane. Dzięki temu mamy pewność że nie zostaną wyczyszczone w trakcie backupu. Robi się to tak:
  1.  Logujemy się SQL Plusem jako sys do bazy
  2. robimy shutdown immediate; (tylko ten jeden raz jest konieczny)
  3. startup mount;
  4. alter database archivelog;
  5. otwieramy bazę dla użytkowników - alter database open;
Jeśli na linuchu zacznie wam coś pultać o TNS listenerze przy próbie ponownego odpalenia bazy to wyjdźcie z SQLPlusa i odpalcie :

export ORACLE_SID=XE


(lub co innego zamiast XE - zależy jak się Wasza baza nazywa) a następnie podłączcie się do wyłączonej bazy w ten sposób:

 sqlplus sys/tajne_haslo as sysdba



dwa  - ten krok można pominąć ale ta konfiguracja sprawia że wygodniej nam będzie nieco później. W Oracle mamy takie coś jak Flash Recovery Area. To taka przestrzeń na backupy i do przywracania zarządzana przez silnik bazy danych a nie system operacyjny. Tam będą składowane nasze backupy. Najpierwej sprawdzamy czy już czasem to nie jest ustawione:

select * from v$recovery_file_dest;

Jeśli nie jest to najpierw tworzymy katalog a następnie ustawiamy :

alter system set db_recovery_file_dest_size = 100G;
alter system set db_recovery_file_dest = 'c:\FRA';

Pierwszy parametr ustawia ile mogą nam maksymalnie zajmować backupy, drugi gdzie mają leżeć.

Sprawdzamy czy wszystko gra:


select * from v$parameter where name='db_recovery_file_dest';
select * from v$parameter where name='db_recovery_file_dest_size';



tri - odpalamy konsolę command line lub shell w zależności od OS a następnie wpisujemy RMAN. Strzeżcie się użytkownicy Ubuntu (i być może innych linuchów też ) bo w systemie macie już program RMAN i w dodatku jest on w pathu więc może Wam się odpalić coś zupełnie innego niż byście się spodziewali. Lepiej więc podajcie pełną ścieżkę do RMANa Oraclowego. Najprawdopodobniej będzie znajdował się tu:

/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/bin/rman

Linuksiarzom podpowiadam że warto też ustawić sobie zmienną środowiskową ORACLE_HOME bo inaczej będą później problemy:



export ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server


Jak już to zrobicie to warto też dodać sobie programy Oracle'owe do patha:


PATH=$PATH:$ORACLE_HOME/bin


Warto te zmienne systemowe ustawić sobie z poziomu użytkownika systemowego oracle - bo to z niego będziemy korzystać.
Logujemy się najpierw na roota a następnie wpisujemy :


su oracle


i zapuszczamy wszystkie te eksporty zmiennych.


Podłączenie do bazy


Jeśli pracujecie na linuchu to zalogujcie się jako użyszkodnik systemowy oracle (su oracle)
Przede wszystkim po odpaleniu RMANa podłączcie się nim do bazy danych. Robi się to tak:

connect target
lub
connect target /
lub
connect target nazwabazy

Jeśli jesteście na linuchu a przy próbie połączenia popluło Wam coś o "insufiscient privileges" to znaczy że nie przelogowaliście się na usera oracle....

Pełna kopia zapasowa

Wykonujemy ją oczywiście po pomyślnym podłączeniu się do bazy.
wpisujemy:

backup database; (Enter :D )


Jako że to jest pełny backup to trochę potrwa, poczekajcie cierpliwie na pojawienie się prompta RMANa.
Wasz backup pojawi się w zdefiniowanym przez Was flash recovery area.


Jeśli chcecie by Wasz backup znalazł się w innym niż domyślne miejscu wpisujecie:


backup database format 'c:\rman\calabaza%u.bck';


Ten tag: %u to po prostu unikalny numer generowany na podstawie daty i kilku innych rzeczy, dzięki czemu każdy plik kopii zapasowej będzie miał unikalny numer.
Tych formatów jest kilka i można je wplatać w nazwę pliku. Przedstawiam te podstawowe:


%s – numer backupu
%d – nazwa bazy danych
%D – dzień
%M – miesiąc
%Y – rok
%u – wartość unikalna wyliczona na podstawie wszystkich w.w opcji


Taki backup obejmuje dane oraz plik kontrolny. Jeśli chcecie zbackupować razem z tym pliki zarchiwizowane dziennika powtórzeń to dajecie:


backup database plus archivelog;



Backup skompresowany


Pliki backupów zajmują sporo miejsca. Czasem dużo za dużo. Warto więc by były kompresowane. Żadna sztuka użyć jakiegoś Winrara, a w razie potrzeby rozkompresować ale po pierwsze RMAN nie będzie w stanie tego czytać a po drugie jeśli usuniecie oryginał to może okazać się że przez przypadek podczas sprawdzania kopii (o tym później) informacja o tym backupie zostanie usunięta. Jest więc możliwość kompresowania przy użyciu RMANa. RMAN stosuje algorytm podobny do ZIP.


Zamiast backup database wpisujecie :

backup as compressed backupset database format '/home/rman/full_compressed%u';
lub przykładowo z plikami (zarchiwizowanymi) dziennika powtórzeń:

backup as compressed backupset database plus archivelog format '/home/rman/full_compressed%u';


Taką kompresję można stosować też przy backupach tablespace'ów oraz backupach przyrostowych i kumulatywnych.
Co prawda kopia zapasowa jeśli jest kompresowana wykonywana jest dużo dłużej, ale zajmuje w efekcie mniej miejsca.





Backup przyrostowy i kumulatywny


Nie zawsze musimy chcieć wykonywać pełną kopię zapasową. Z resztą po co nam za każdym razem całość jeśli można pełny backup zrobić a później wykorzystywać zajmujące znacznie mniej miejsca kopie przyrostowe.


Definicje:
Kopia pełna - czyli kopia wszystkich plików danych oraz pliku kontrolnego
Kopia przyrostowa - czyli kopia tylko tych bloków danych które uległy zmianie od ostatniego pełnego lub przyrostowego backupu.
Kopia kumulatywna - kopia wszystkich bloków danych które uległy zmianie od ostatniego pełnego (!!! już nie ostatniego przyrostowego) backupu.

Od wersji 10g Oracle obsługuje dwa poziomy kopii przyrostowej : 0 i 1. Kopia przyrostowa poziomu 0 fizycznie nie różni się niczym od pełnego backupu, z tą różnicą że na jej podstawie możemy wykonywać normalne kopie przyrostowe (poziom 1). Tak więc przynajmniej raz musicie zrobić:

backup incremental level 0 database format '/home/rman/przyrostowa_0_%u';

aby następnie móc wykonywać :

 backup incremental level 1 database format '/home/rman/przytostowa_1_%u';

To z level 1 to już jest normalna kopia przyrostowa. Porównaj wielkość plików z backupu level 1 i level 0. Aby wykonać kopię kumulatywną wpisujecie :





Backup incremental level 1 cumulative database;

Warto dość często wykonywać kopie przyrostowe, a raz na jakiś czas (np. tydzień) kopię kumulatywną. Dzięki czemu będziemy mogli potem pozbyć się przyrostowych i mieć mniejszą ilość plików do przechowywania.

Ten tag możemy łączyć z  innymi poznanymi wcześniej:

backup incremental level 1 format '/home/rman/inc_comp_%u' as compressed backupset database plus archivelog;


Szybki backup przyrostowy

Normalnie backup przyrostowy realizowany jest tak, że ostatni backup z danymi  porównywany jest blok po bloku. Zamiast tego, można zrobić tak by Oracle tworzyło sobie listę zmienionych bloków. W takim wypadku backup przebiegał będzie znacznie szybciej. Niestety ta opcja jest dostępna tylko w wersjach Standard i Enterprise.

Najpierw sprawdź czy oby już ta opcja nie jest włączona:

select * from v$parameter where name='db_create_file_dest';

Jeśli pole value będziesz miał puste to znaczy że nie było to wcześniej ustawiane.
Stwórzcie katalog w którym taka lista będzie przechowywana a następnie:


alter system set db_create_file_dest=’/home/rman/fib’;


 oraz włączamy tą opcję:
alter database enable block change tracking;

 Backup wieloplikowy

Można to tak nazwać? Generalnie rozchodzi się o to, że to taki backup który wygeneruje nam wiele plików. Każdy plik będzie zawierał jeden lub więcej plików bazodanowych. Generalnie robi się to tak:

Backup as backupset format ‘/home/rman/cala_w_czesciach%u.bck’ database;

Całkiem to dobre bo nie wygeneruje nam jednego wielkiego pliku. Niektóre systemy mają problemy z plikami większymi niż 2GB (pozdrowienia dla zwolenników Windowsa :D )


Backup tablespace'ów

RMANem możesz wykonywać również backupy tablespace'ów, plików danych, pliku parametrów, pliku kontrolnego. Jeśli chcesz robić backupy danych na poziomie schematu czy tabeli musisz skorzystać z Oracle Data Pump czyli narzędzi imp i exp. Opis znajdziesz tutaj.
Najpierw sprawdź jakie w ogóle masz tablespace'y:

select * from dba_tablespaces;

Komenda do backupu wybranego tablespace'a:

backup tablespace users format '/home/rman/users%u';

Klauzulka format jest oczywiście nieobowiązkowa. Możemy też chcieć zapisać kilka tablespace'ów i wtedy rozdzielamy ich nazwy przecinkami:

backup tablespace users,system format '/home/rman/users_system%u';

albo zechcieć je dodatkowo skompresować:

backup as compressed backupset tablespace users format '/home/rman/users_compressed%u';

albo zrobić nie dość że skompresowaną to jeszcze przyrostową (oszczędzamy miejsce - dyski kiedyś się kończą).:

backup as compressed backupset incremental level 1 format '/home/rman/users_comp_przyr%u' tablespace users;


Backup pliku parametrów

Komenda (format jest opcjonalny):

backup spfile format '/home/rman/spfile%u';


Backup pliku kontrolnego

Jeśli nie korzystać z opcji CATALOG RMANa ( o tym później) to warto robić sobie osobną kopię pliku kontrolnego. Czemu? Temu że informacje o backupach przechowywane są właśnie w nim. Co prawda w pełnych backupach jest też kopia pliku kontrolnego, ale jak chcecie taki backup przywrócić jeśli szlag Wam trafi plik kontrolny ? W razie czego dużo łatwiej odzyskać najpierw plik kontrolny a później resztę.
Więc dziabiemy:

 backup current controlfile format '/home/rman/controlfile%u';

Taką kopię pliku kontrolnego (zwłaszcza że nie zajmuje wiele miejsca) warto mieć jak najświeższą. Dbanie o to by tak było możemy zlecić silnikowi bazy:

configure controlfilebackup on;

Od tej pory jeśli nastąpi jakakolwiek zmiana wpływająca na plik kontrolny, ten zostanie automatycznie zbackupowany po zmianach.
Możemy teraz chcieć by rman backupował nam plik kontrolny w inne miejsce niż domyślne. Dajemy wtedy:

CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/home/rman/plikkontrolny%F';

To %F na końcu jest niestety konieczne. Zapewnia unikalność nazw plików.



Kopia zapasowa plików zarchiwizowanych dziennika powtórzeń


select * from v$datafile;
backup as copy datafile ‘C:\APP\ADMINISTRATOR\ORADATA\ORCL\USERS01.DBF’ format ‘c:\rman\users.dbf’;  -- kopiuje wszystkie bloki , zajęte czy nie. Jeśli więc będziemy mięli określony tablespace o wyznaczonej z góry sporej wielkości, backup zajmie niepotrzebnie bardzo dużo miejsca


O przywracaniu będzie w następnym rozdziale.

2 komentarze:

  1. hmm, a mi się wydawało, że backupy online można spokojnie robić bez rmana...

    OdpowiedzUsuń
  2. Podasz jakiś przykład działającego rozwiązania? Backup zrobić można, tylko weź to potem przywróć tak by działało (biorąc pod uwagę masę zależności, część danych występująca tylko w buforze, oraz ciągle zmieniające się dane).

    OdpowiedzUsuń