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-mmdd') 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