poniedziałek, 2 lipca 2012

Podstawowy flashback




Parametr UNDO_RETENTION

Jeśli zdarzyło nam się przy jakimś update i chcielibyśmy cofnąć zmiany, co powinniśmy zrobić? Jeśli nie mamy włączonego autocommita to żaden problem zrobić ROLLBACK. Co jednak jeśli zacommitowaliśmy sami, albo mieliśmy włączonego autocommita i dopiero po kilku innych zmianach odkryliśmy pomyłkę? Dzięki opcji flashback nie zawsze jest konieczne odzyskiwanie danych z backupu. Odpowiada za to tablespace undo. To jak długo stare dane mają pozostawać dostępne określa parametr undo_retention ustawiony domyślnie na 15 minut. Aby poznać wartość parametru undo_retention(wartość podawana w sekundach) musimy zajrzeć do słownika v$parameter. Wywołujemy zatem komendę:



SELECT NAME, VALUE FROM V$PARAMETER WHERE NAME='UNDO_RETENTION';
Wartość tę możemy modyfikować używając komendy:

ALTER SYSTEM SET UNDO_RETENTION=wartość_w_sekundach SCOPE=SPFILE; 






Po zmianie parametru undo_retention możemy sprawdzić czy parametr jest zmieniony. Jako, że wpisaliśmy scope=spfile; musimy zamknąć i ponownie otworzyć bazę danych.





AS OF TIMESTAMP

Zróbmy sobie kopię tabeli employees:






Spójrzmy na zegarek. To jest czas kiedy z tabelą jest jeszcze wszystko w porządku. Poczekajmy parę chwil, żeby czas chociaż o minutę zmienił. Teraz popełniamy pomyłkę – zmieńmy wysokość wynagrodzenia pracowników (kolumna salary) zapominając dodać warunek where lub po prostu skasujmy zawartość tabeli. Nie kasujmy danych przy użyciu komendy truncate, ponieważ tak skasowanych danych nie uda nam się odzyskać.







Poczekajmy parę chwil. Określmy dokładnie czas kiedy tabela znajdowała się jeszcze w prawidłowej postaci. Aby zobaczyć jak wyglądała tabela o określonym czasie posługujemy się funkcją to_timestamp:


SELECT * FROM WYPADEK as of timestamp (to_timestamp(
'12:38:00 2010-11-28','hh24:mi:ss yyyy-mm-dd') );







Dodanie klauzuli as of timestamp spowodowało wyświetlenie całej zawartości tabeli WYPADEK takiej jaka była we wskazanym czasie. Funkcja to_timestamp zwraca nam dane typu timestamp z tekstu. Drugi parametr to wzorzec. Przyjmuje takie same znaczniki jak funkcja to_date. Przyjmuje datę w postaci tekstu, zamienia wg. wzorca na format daty. Jeśli chcesz dodać dodatkowe warunki do zapytania, where dodawaj zawsze po ciągu związanym z flashbackiem:


SELECT * FROM WYPADEK as of timestamp to_timestamp('12:38:00 2010-11-28','hh24:mi:ss yyyy-mm­dd') where department_id=60;


Bardzo wygodną możliwość porównywania starej i nowej zawartości tabeli umożliwiają nam operatory zbiorowe takie jak INTERSECT czy MINUS


Możemy teraz przenieść sobie te dane do jakiejś innej tabeli:


CREATE TABLE WYPADEK2 AS SELECT * FROM WYPADEK WHERE 1=2; INSERT INTO WYPADEK2 SELECT * FROM WYPADEK as of timestamp ( to_timestamp('12:38:00 2010-11-28','hh24:mi:ss yyyy-mm-dd') );


FLASHBACK TABLE


Aby wykorzystać mechanizm flashback do przywrócenia tabeli do stanu z określonego czasu, wykorzystujemy komendę flashback table:



FLASHBACK TABLE EMPLOYEES TO TIMESTAMP TO_TIMESTAMP('10-09-2011 21:00:03','dd-mm-yyyy hh24:mi:ss');


Taka możliwość dostępna jest niestety tylko w najbardziej rozbudowanej i jednocześnie najdroższej wersji RDBMS Oracle tj. Enterprise.

Istnieje również możliwość przywrócenia skasowanej tabeli. Jeśli przypadkowo usuniemy tabelę poleceniem:

DROP TABLE nazwa_tabeli;

Możemy zajrzeć do 'śmietnika' naszej bazy. Jest on opróżniany z danej tabeli po czasie, który upłynie między usunięciem tabeli a wartością UNDO_RETENTION:

SELECT * FROM USER_RECYCLEBIN;








* jeśli jesteśmy zalogowani jako sys, zostaną nam wyświetlone tabele usunięte przez wszystkich użytkowników. Wpisujemy komendę:


SELECT * FROM DBA_RECYCLEBIN;







W celu przywrócenia usuniętej tabeli wprowadzamy komendę:


FLASHBACK TABLE nazwa_tabeli TO BEFORE DROP;











Brak komentarzy:

Prześlij komentarz