Oracle Flashback – przegląd możliwości

Transkrypt

Oracle Flashback – przegląd możliwości
XVI Konferencja PLOUG
Kościelisko
Październik 2010
Oracle Flashback – przegląd możliwości
Mariusz Żuk
OPITZ CONSULTING Kraków Sp.z.o.o.
[email protected]
Abstrakt. Celem prezentacji jest omówienie technologii Oracle Flashback oraz usystematyzowanie wiedzy z tego zakresu. Oracle
począwszy od wersji bazy danych 9i nieustannie poszerza tą technologię dodając do niej nowe narzędzia. Oracle Flashback znacznie
ułatwia korygowanie błędów popełnianych przez użytkowników eliminując często potrzebę wykonywania point-in-time recovery.
Omówione zostaną najczęstsze scenariusze zastosowania tej technologi oraz ich porównanie do „klasycznych rozwiązań”. Tekst został
zaczerpnięty z artykułu mojego autorstwa o tym samym tytule z magazynu „Ploug’tki” nr 51.
Oracle Flashback – przegląd możliwości
101
1. Wstęp
Termin Flashback pojawił się sie po raz pierwszy już kilka lat temu wraz z wersją Oracle 9i
w postaci nowej technologii znanej jako Flashback Query. Było to nowe rozwiązanie mające na
celu usprawnienie korygowania błędów popełnianych przez użytkowników lub też wykonywanie
analiz historycznych. Oracle 10g znacznie rozszerzyło funkcjonalność flashback pokrywając niemalże każdy obszar bazy danych. Różnorodność wprowadzonych zmian w wersji 10g oraz później
w 11g sprawia, że Oracle Flashback stanowi dziś dość potężne narzędzie.
Rys. 1. Flashback
2. Zastosowanie Oracle Flashback
W bazie danych może wystąpić wiele rodzajów błędów, wywoływanych najczęściej przez
działania użytkowników.
Podanie błędnych wartości w poleceniach update, pominiecie klauzuli where w poleceniu delete, omyłkowe usunięcie tabeli bądź też użytkownika wcale nie należy do rzadkości. Do wersji
Oracle 9i niemalże jedynym sposobem na poprawienie takich błędów było wykonanie point-intime recovery. Alternatywą była jeszcze dodatkowa baza danych typu standby z ustawionym kilkugodzinnym opóźnieniem w stosunku do bazy primary. Opóźnienie zmniejsza ryzyko przejęcia
błędu, lecz rozwiązanie to nie jest proste w implementacji. Wiąże się z dodatkowymi kosztami
a i tak nie pomoże nam, jeśli odkryjemy błąd, który wystąpił wcześniej niż wynosi opóźnienie.
Również zabezpieczenie bazy primary może nie być w takim przypadku wystarczające. Point-intime recovery również posiada dość znaczne ograniczenia. Mianowicie, jeśli przywrócimy bazę do
momentu, w którym wystąpił dany błąd również poprawne dane, które byśmy chcieli zachować
zostaną odrzucone. Czas przywracania bazy jest zależny od wielkości baz danych i ilości wprowadzonych zmian. Jeśli natomiast Backup znajduje sie na taśmach czas przywracania może się jeszcze znacznie bardziej wydłużyć.
102
Mariusz Żuk
Rys. 2. Baza danych typu Standby
Oracle daje nam w postaci technologii Flashback kilka sposobów, aby móc cofnąć się do przeszłości.
STANDARD EDITION:
Od 9i:
•
Flashback (Version) Query
Od 10g:
•
Flashback Drop
ENTEPRISE EDITION:
Od 10g:
•
Flashback Transaction Query,
•
Flashback Table,
•
Flashback Database
Od 11g:
•
Flashback Transaction Backout,
•
Flashback Data Archive – dodatkowo płatne
Działają one znacznie szybciej niż klasyczny point-in-time recovery(PITR). Działają na poziomie transakcji, tabeli oraz bazy. Wiele typowych błędów może zostać naprawiona
całkowicie bez użycia PITR. Również znalezienie dokładnego punktu w czasie, w którym wystąpił błąd nie stanowi większego problemu.
Aby Flashback działał prawidłowo należy włączyć automatyczne zarządzanie segmentami wycofania.(Parametr UNDO_MANAGEMENT=AUTO).Następnie ustawiamy czas, przez jaki będą
przechowywane segmenty wycofania. Domyślnie jest to 900 czyli 15min.Należy pamiętać, że
dopiero ustawienie parametru RETENTION GUARANTEE zagwarantuje nam, że segmenty te
będą faktycznie tyle czasu przechowywane. W innym przypadku, jeśli rozmiar undo tablespace
będzie ustawione na zbyt małą wartość, inna transakcja może nadpisać nam zawartość segmentów
wycofania. Jednak i tu trzeba być ostrożnym, gdyż ustawione RETENTION GUARANTEE przy
zbyt małej undo tablespace spowoduje, że instancja zostanie wstrzymana podobnie jak w przypadku problemów z procesami archiwizatora!
Oracle Flashback – przegląd możliwości
103
2.1. Flashback Query
Jak wyglądały dane dziś rano? Jakie zmiany na danych zostały dziś rano wykonane? Kiedy dokładnie zostało wykonane błędne polecenie SQL? Jak można te zmiany z powrotem cofnąć? Jeśli
szukamy odpowiedzi na powyższe pytania sięgnijmy po Flashback Query. Używamy go przez
zastosowanie w zapytaniu select klauzuli as of, która służy do sprawdzenia stanu tabeli
w momencie wskazywanym przez SCN, bądź przez określony punkt w czasie. Aby zatem odpowiedzieć na pierwsze pytanie stosujemy przykładowe zapytanie, które zwróci nam stan tabeli z godziny 7 rano:
SQL> select * from dept
AS OF timestamp to_timestamp('04-08-2010 07:00:00','dd-mm-yyyy hh24:mi:ss');
DEPTNO DNAME
LOC
---------- -------------- ------------10 ACCOUNTING
NEW YORK
20 RESEARCH
DALLAS
30 SALES
CHICAGO
40 OPERATIONS
BOSTON
2.2. Flashback Version Query
Narzędzie to zapewni nam wyższy poziom szczegółowości niż użycie klauzuli as of. Mianowicie w naszym przypadku pozwoli nam odpowiedzieć na drugie pytanie, czyli jakie dane zostały
zmienione. Flashback Version Query zwraca historię danej tabeli miedzy podanymi SCN lub
danym przedziale czasowym. Prześledźmy poniższy przykład:
Sprawdzamy aktualny SCN:
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
-----------------------584603
Zmiana danych w tabeli:
update dept set loc='WARSZAWA' where deptno=10;
1 row updated.
SQL> commit;
Dodanie nowego wiersza:
SQL> insert into dept values (50,'MARKETING', 'KRAKOW');
1 row created.
SQL> commit;
Commit complete.
Sprawdzenie SCN po zmianach:
GET_SYSTEM_CHANGE_NUMBER
-----------------------584648
Używając klauzuli version between zapytanie zwróci nam wszystkie zmiany dokonane na danych w tabeli. Można również dodać szereg tzw. pseudokolumn, aby uzyskać więcej szczegółów:
SQL> select versions_startscn startscnt, versions_endscn endscn,
versions_xid xid, versions_operation oper, deptno, dname, loc
from scott.dept
versions between scn 584603 and 584648;
104
Mariusz Żuk
STARTSCNT
ENDSCN XID
O DEPTNO DNAME
---------- ---------- ---------------- - ------ -------------584647
0A00010041020000 I
50 MARKETING
584619
090011001A020000 U
10 ACCOUNTING
584619
10 ACCOUNTING
20 RESEARCH
30 SALES
40 OPERATIONS
LOC
-----KRAKOW
WARSZAWA
NEW YORK
DALLAS
CHICAGO
BOSTON
Pseudokolumny:
VERSIONS_STARTTIME
Początkowy timestamp danej wersji
VERSIOSNS_ENDTIME
Końcowy timestamp danej wersji
VERSIONS_STARTSCN
Początkowy SCN danej wersji
VERSION_ENDSCN
Końcowy SCN danej wersji
VERSIONS_XID
Identyfikator transakcji
VERSIONS_OPERATION
Przeprowadzona operacja I-insert, U-update, D-delete
2.3. Flashback Transaction Query
Gdy udało nam sie już zidentyfikować nieprawidłową zmianę w tabeli możemy dowiedzieć się,
jaka transakcja jest za to odpowiedzialna i jaki użytkownik tą transakcję wykonał. Posłuży nam do
tego Flashback Transaction Query. W przeciwieństwie do Flashback Query, funkcja Flashback
Transaction Query nie bazuje na tabeli, na której zostały wykonane błędne transakcje, lecz korzysta ona z widoku słownika danych FLASHBACK_TRANSACTION_QUERY.
SQL> select logon_user, undo_sql
from flashback_transaction_query
where table_owner ='SCOTT' and table_name = 'DEPT'
order by commit_timestamp desc;
LOGON_USER UNDO_SQL
---------- ---------------------------------------------------------------KOWALSKI update "SCOTT"."DEPT" set "LOC" = 'NEW YORK' where ROWID = 'AAAQ+JAAEAAAAAPAAA';KOWALSKI
insert into
"SCOTT"."DEPT"("DEPTNO","DNAME","LOC") values ('50','MARKETING','WARSZAWA');
2.4. Flashback Transaction Backout
Czy nie byłoby pięknie móc cofnąć nawet zatwierdzone transakcje wraz z jej wszystkimi zależnościami bez konieczności zmiany trybu bazy na offline? W Oracle 11g jest to możliwe i to za
pomocą pojedynczego kliknięcia! (Database Control) Transaction Backout bazuje na segmentach
wycofania jak również na archived redo logs. Zanim zaczniemy stosować Flashback Transaction
Backout należy włączyć dodatkowy poziom logowania (supplemental logging):
SQL> alter database add supplemental log data;
Flashback Transaction Backout można zarządzać poprzez Database Control jak i procedurę
TRANSACTION_BACKOUT.
Procedura Transaction Backout zawiera następujące parametry:
NUMBEROFXIDS – ilość transakcji do wycofania
XIDS – numery identyfikujące dane transakcje przekazane w postaci wektora.
OPTIONS – zależności odnośnie transakcji będących rodzicem i potomkiem
Oracle Flashback – przegląd możliwości
105
NOCASCADE – opcja domyślna, używamy, jeśli nie przewidujemy żadnych zależności
między transakcjami.
CASCADE – wycofuje najpierw zależne transakcje.
NOCASCADE_FORCE – wycofuje główne transakcje (rodzica) i ignoruje wszystkie inne.
SCNHINT: Początkowy numer SCN danej transakcji.
Poniższy przykład demonstruje wycofanie transakcji wraz z transakcją jej podlegającą za pomocą pojedynczego wykonania.
declare
trans_arr xid_array;
begin
trans_arr := xid_array('030003000D02840','D10001000D02850');
dbms_flashback.transaction_backout (
numtxns => 1,
xids => trans_arr,
options => dbms_flashback.nocascade
);
end;
2.5. Flashback Table
Funkcja Flashback Table umożliwia odtworzenie stanu tabeli z określonego momentu
w przeszłości bez potrzeby sięgania do backupu. Wywołując Flashback Table nie tylko przywrócimy wiersze w tej tabeli, lecz również indeksy, więzy integralności, wyzwalacze. Metodę tą stosujemy wówczas, gdy zakres błędów jest stosunkowo niewielki tzn. ogranicza się do pojedynczej
tabeli bądź też, co najwyżej kilku tabel.
Przed zastosowaniem Flashback Table trzeba włączyć możliwość zmiany numeru wierszy –
ROWID (alter table … enable row movement). Następnym krokiem jest nadanie prawa
FLASHBACK ANY TABLE . Użytkownik wykonujący funkcję Flashback Table musi również posiadać prawa select, insert, delete oraz alter table na docelowej tabeli. Aby dokładnie określić moment, do jakiego chcemy przywrócić tabelę możemy użyć
wcześniej omówione Flashback Query i Flashback Transaction Query.
Poniższe polecenie przywróci nam stan tabeli sprzed pół godziny:
SQL> flashback table
Flashback complete.
emp to timestamp systimestamp - interval '30' minute;
Stosowanie Flashback Table jest dość proste, funkcję tą możemy również wywołać z Enterprise Managera. W obu przypadkach należy jednak pamiętać o pewnych ograniczeniach.
Flashback Table nie można stosować:
• Na tabelach systemowych
• Zmaterializowanych widokach
• Po wykonaniu polecenia shrink
• Po poleceniach DDL :
alter table … drop column
alter table .. drop partition
create cluster
truncate table
alter table move
106
Mariusz Żuk
Jeśli się nie zastosujemy do tych ograniczeń otrzymamy błąd ORA-01445: Unable to read
data – table definition Has changed.
2.6. Flashback Drop
W wersjach wcześniejszych niż Oracle 10g wywołanie polecenia drop table na stałe usuwało tabelę z bazy, a jedynym sposobem na jej przywrócenie było wykonanie point-in-time
recovery. Od wersji 10g obiekty nie są natychmiastowo usuwane. System wygeneruje dla danego
obiektu i obiektów mu podlegających (indeksy, więzy integralności, wyzwalacze) nową nazwę,
lecz fizycznie pozostaną one tymczasowo w tym samym miejscu. Możemy się odwołać do tych
obiektów poprzez „kosz” (recycle bin). Rozwiązanie to pozwala na przywrócenie omyłkowo
skasowanej tabeli. Flashback Drop w odróżnieniu od Flashback Table nie opiera się na segmentach wycofania (udo), lecz wykorzystuje mechanizm recycle bin.
Na początek sprawdzamy czy funkcja recycle bin jest włączona:
SQL> show parameter recyclebin
NAME
TYPE
VALUE
------------------------------------ ----------- ------recyclebin
string
on
Usuwamy tabelę:
SQL> drop table scott.emp;
Table dropped.
SQL> select * from scott.emp;
select * from scott.emp
*
ERROR at line 1:
ORA-00942: table or view does not exist
Przeglądamy nowy wpis w recycle bin:
SQL> select object_name, original_name, ts_name, droptime from recyclebin;
OBJECT_NAME
ORIGINAL_NAME TS_NAME DROPTIME
------------------------------ -----------BIN$d7A4q8DPGxLgQKjADwod9w==$0 EMP
-------- -------USERS 2009-11-06:08:59:20
Można również użyć polecenia:
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME
OBJECT
TYPE DROP TIME
------------ ------------------------------ ------------ -----EMP
BIN$d7A4q8DPGxLgQKjADwod9w==$0 TABLE 2009-11-6:08:59:20
Przywracanie skasowanej tabeli:
SQL> flashback table scott.emp to before drop;
Flashback complete
SQL> select * from recyclebin;
no rows selected
Oracle Flashback – przegląd możliwości
107
Przywracanie ze zmianą nazwy tabeli:
SQL> flashback table flashback_test to before drop rename to flashback_test_1;
Flashback complete.
Opróżnianie recycle bin:
Purge
Purge
Purge
Purge
Purge
recyclebin
table <naywa_tabeli>
index <nazwa indeksu>
tablespace <nazwa_ts>
dba_recyclebin
– dla aktualnego użytkownika
– usuwa tabelę na stałe
– usuwa index
– opróżnia kosz w podanej przestrzeni tabel
– oprożnia cały kosz
Kasowanie tabeli z pominięciem kosza
Drtop table <nazwa_tabeli> purge
Recycle bin posiada pewne ograniczenia. Obiekty będą w nim przechowywane dopóki jest
wystarczająca ilość miejsca. Jeśli miejsca jest mało, obiekty będą kasowane zaczynając od najstarszego. Funkcja autoextend również zacznie od opróżnienia recycle bin. Jego rozmiar
i czas przechowywania obiektów zależy tylko od ilości wolnego miejsca w przestrzeni tabel. Nie
jest możliwe korzystnie z jego funkcji w systemowej przestrzeni tabel.
2.7. Flashback Database
Wcześniej opisane funkcje Flashback operowały na poszczególnych obiektach. Flashback Database umożliwia przywrócenie całej bazy do określonego momentu w przeszłości i odbywa się to
zdecydowanie szybciej niż innymi dostępnymi metodami. Jest on bardzo użyteczny w przypadku
logicznych błędów na, wskutek, których zostały zmienione duże ilości danych.
Aby móc skorzystać z Flashback Database należy najpierw wykonać poniższe polecenie na bazie w trybie mount.
SQL> alter database flashback on;
Database altered.
Następnie ustawiamy poniższe parametry:
DB_RECOVERY_FILE_DEST - ustala obszar szybkiego odtwarzania FRA (Flash Recovery Area),
w którym przechowywane będą między innymi logi flashback. DB_RECOVERY_FILE_DEST_SIZE
– rozmiar FRA
DB_FLASHBACK_RETENTION_TARGET – ustala górny limit wyrażony w minutach, do jakiegomożemy cofnąć bazę danych.
Kolejnym założeniem jest, aby baza pracowała w trybie archivelog.
Flashback database tworzy dodatkowe logi, które są niezbędne do odtworzenia bazy. Za ich
zapisywanie odpowiedzialny jest nowy proces RVWR (Recovery Writer process)
Gdy mamy już poprawnie skonfigurowaną bazę możemy wykonać zapytanie na widoku
V$FLASBHACK_DATABASE_LOG, aby określić, do jakiego momentu możemy przywrócić bazę danych
SQL> select * from v$Flashback_database_log;
OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK RETENTION_TARGET FLASHBACK_SIZE
-------------------- ---------------- ---------------- -------------ESTIMATED_FLASHBACK_SIZE
-----------------------655767 06-11-2009 09:58
1440
16384000
Aby przywrócić bazę danych do żądanego okresu należy posiadać uprawnienia sysdba i uruchomić bazę w trybie mount.
SQL> flashback database to timestamp to_date('06-11-2009 10:15');
108
Mariusz Żuk
Flashback complete.
Po ukończeniu operacji otwieramy bazę z opcją resetlogs.
SQL> alter database open resetlogs;
Database altered.
Od wersji Oracle 10.2 mamy możliwość tworzenia tak zwanych punktów przywracania, które
są niczym innym jak aliasem do SCN.
SQL> create restore point przed_testem;
Restore point created.
FLASHBACK DATABASE …
… TO (SCN|TIMESTAMP);
… TO Before RESETLOGS;
… TO RESTORE POINT <RESTORE_POINT_NAME)
Wynik zastosowania Flashback Database jest taki sam jak w przypadku tradycyjnego point-intime recovery. Jednakże jest on dużo prostszy w użyciu a przy tym wymaga znacznie mniej czasu.
W jakich przypadkach nam Flashback Database nie pomoże?
Flashback Database nie da się zastosować, gdy usunięta zostanie przestrzeń tabel. Również,
gdy plik danych zostanie pomniejszony lub gdy stworzymy nowe pliki kontrolne. Jeżeli w zarchiwizowanych dziennikach oraz obszarze FRA nie ma wystarczającej ilości danych, w celu przywrócenia danych należy zastosować tradycyjne metody odzyskiwania.
2.8. Flashback Data Archive:
Dotychczas opisane funkcje flashback sprawdzają się doskonale w przypadku, gdy chcemy się
dowiedzieć jak wyglądały dane w niedalekiej przeszłości. W zależności od wielkości przestrzeni
tabel i paramentów jak UNDO RETENTION bądź też DB_FLASHBACK_RETENTION_TARGET
mogliśmy mieć dostęp do danych sprzed kilku do kilkunastu godzin. Nasuwa się, więc pytanie jak
śledzić zmiany danych na przestrzeni lat? Z pomocą idzie nam najnowsze narzędzie z rodziny
Flashback dostępne od wersji Oracle 11g, Flashback Data Archive. Narzędzie to zapisuje zmiany
DML danej tabeli przez zdefiniowany okres czasu. W tym celu Flashback Data Archive tworzy
nową wewnętrzną tabelę, która jest repliką danej tabeli z dodatkowymi kolumnami zawierającymi
znacznik czasowy timestamp. Każda operacja update czy też delete na tabeli śledzonej powoduje utworzenie nowego wiersza w tabeli wewnętrznej. Dla uzyskania lepszej wydajności zastosowano tabelę partycjonowaną, która jest również kompresowana, aby zaoszczędzić miejsce na
dysku.
Aby rozpocząć pracę z Flashback Data Archive, przestrzeń tabel musi być zarządzana automatycznie (Automatic Segment Space ASSM). Drugim wymaganiem jest automatyczne zarządzanie
segmentami wycofania. (Automatic Undo Managament).
Następnie definiujemy miejsce przechowywania naszych danych historycznych:
SQL> create flashback archive fda1
2 tablespace tbs1
3 retention 5 year;
Flashback archive created.
Za pomocą tego polecenia utworzyliśmy logiczny kontener na nasze dane, które przechowywane będą przez okres 5 lat. Opcjonalnie możemy określić parametr quota czyli limit miejsca na dysku przeznaczony na archiwizacje.
Podajemy, dla jakiej tabeli chcemy rejestrować zmiany:
SQL> alter table scott.emp flashback archive fda1;
Table altered.
Oracle Flashback – przegląd możliwości
109
W celu dostępu do danych historycznych stosujemy konstrukcję „AS OF”
Select first_name, salary
from employees
as fo timestamp to_timestamp(‘05-01-2005
00:00:00’, ‘DD-MM-YYYY HH24:MI:SS’)
Należy pamiętać, że operacje DDL takie jak modyfikowanie kolumn, drop, truncate są niemożliwe na śledzonej tabeli jedynie w wersji Oracle 11.1. W najnowszej wersji 11.2 ograniczenie
to zostało zniesione.
3. Podsumowanie
Rodzina Oracle Flashback rozrasta się z każdą kolejną wersją bazy danych Oracle. Stanowi ona
doskonałe narzędzie do naprawiania błędów logicznych i błędów popełnianych przez użytkowników. Operacje przywracania danych w porównaniu do tradycyjnych metod zostały zredukowane
do kilku minut lub też nawet sekund, zachowując w wielu przypadkach wysoką dostępność bazy
danych. Trzeba jednak pamiętać, że technologia ta nie pomoże nam w przypadku błędów fizycznych takich jak uszkodzenia dysku. Stosowanie Oracle Flashback wiąże się również w zależności
od zdefiniowanego przedziału czasowego z znacznym wzrostem miejsca na dysku wymaganego
przez przestrzeń wycofań (UNDO), Flashback logs, czy też Flashback Data Archive. Większość
funkcji Flashback dostępnych jest jedynie w wersji Enterprise, a za korzystanie z Flashback Data
Archive trzeba dodatkowo zapłacić. Niemniej Oracle Flashback jest bardzo ciekawym i funkcjonalnym rozszerzeniem narzędzi każdego DBA.
Bibliografia
[1]
Żuk M. Oracle Flashback – przegląd możliwości. Magazyn Ploug’tki nr 51.
[2]
Schulz.D Opitz Consulting „Oracle Flashback – ein Überblick“.
[3]
Kevin Loney Bob Bryla Oracle Database10g Podręcznik administratora baz danych.
[4]
Sam R. Alapati Expert Oracle Database 11g Administration.

Podobne dokumenty