niedziela, 28 listopada 2010

Zaglądamy w przeszłość :) Czyli odzyskiwanie utraconych danych dla NIE-adminów

Pewnie drogi czytelniku zdarzyło Ci się już nie raz pomylić się przy jakimś update i chciałbyś cofnąć zmiany. Jeśli nie masz włączonego autocommita to żaden problem zrobić ROLLBACK. Co jednak jeśli zacommitowałeś sam albo miałeś włączonego autocommita i dopiero po kilku innych zmianach ogarnąłeś się że coś jest nie tak?
Telefon do admina i przywracanie z backupu? Nie zawsze jest to konieczne. Jak to mówi Czesio z "Włatcóf muh" - teraz będzie sztuczka magiczka :).

Robimy! Zrób sobie kopię tabeli employees albo jakiejś innej. Sprawdzam i widzę że są jakieś dane.



Spójrz na zegarek. U mnie jest 12:38.  To jest czas kiedy z tabelą jest jeszcze wszystko w porządku. Tzn - jeszcze przed moimi niecnymi działaniami. Poczekaj parę chwil - tak ze dwie minuty, żeby nam się czas chociaż o minutę zmienił.
To teraz robimy problemy. Kasujemy wszystko z tabeli i commitujemy. 

Idź po kawę. Symulujemy poranne zamulenie, czyli udajemy że cośtam robisz i dopiero za moment się połapiesz że zwaliłeś akcję. Jak chcesz to możesz jeszcze sobie coś pododawać do tabeli, pozmieniać i pokasować dodane dane. Tak dla mocniejszego efektu dzieła zniszczenia.

Minęło już trochę?

To właśnie się połapaliśmy że nabroiliśmy. Wiemy że tabelka zawierała jeszcze poprawne dane jakieś 10 minut temu. "Chciałbym się cofnąć w czasie o te 10 minut".... No to się cofnij! :



Kodzik:

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

Tylko oczywiście zmień sobie datę i czas na swoje :) 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.

Możesz 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')  );

Tadam!

Brak komentarzy:

Prześlij komentarz