Odzyskiwanie skasowanych danych z logu transakcyjnego SQL Server’a

W artykule Odzyskiwanie skasowanych danych z kopii zapasowej lub z plików online bazy danych pokazaliśmy dwa scenariusze odzyskiwania, jeden z pełnej kopii zapasowej bazy danych, drugi z plików online bazy danych – plików MDF. Oprócz tych dwóch źródeł, do odzyskiwania danych można wykorzystać log transakcyjny bazy danych.

W logu transakcyjnym bazy danych SQL Server’a zapisywane są informacje o każdej zmianie danych lub zmianie schematu bazy danych. Jeżeli chcemy wycofać transakcje, wykonujące kasowanie, to jest to możliwe tak długo, jak długo transakcje te są w logu transakcyjnym online, w odłączonym pliku logu transakcyjnego lub w kopii zapasowej logu transakcyjnego.

Jeśli baza danych działa:

  • w trybie Full recovery, to transakcje kasujące dane istnieją w logu transakcyjnym online lub kopii zapasowej logu transakcyjnego, zakładając, że została ona utworzona po skasowaniu rekordów,
  • w trybie Bulk_logged recovery, to transakcje kasujące są w pełni zapisywane do logu transakcyjnego online, z wyjątkiem instrukcji, kasujących obiekty typu BLOB. Ponieważ kasowanie i wstawianie obiektów typu BLOB nie jest logowane w logu transakcyjnym, to nie jest możliwe ich odtworzenie. Jednak kasowanie danych innego typu jest w pełni logowane, więc możliwe jest ich odtworzenie po skasowaniu, jeśli kopia zapasowa logu transakcyjnego jest utworzona po skasowaniu rekordów,
  • w trybie Simple recovery, i na bazie wykonano wiele transakcji, to transakcje kasowania nie istnieją w logu transakcyjnym. W takim przypadku im szybciej uruchomi się narzędzie do czytania logu transakcyjnego, tym większe szanse na odtworzenie skasowanych danych.

Wykorzystanie ApexSQL Log

Do przeczytania logu transakcyjnego online bazy danych, odłączonego logu transakcyjnego lub kopii zapasowej logu transakcyjnego (także skompresowanej), można wykorzystać ApexSQL Log. Narzędzie umożliwia czytanie logu transakcyjnego SQL Server’a, przeglądanie rekordów w logu, wycofywanie zmian na danych i obiektach, lub ponowne ich wykonywanie, także w sytuacji, w której ApexSQL Log został zainstalowany po wykonaniu zmian. ApexSQL Log dodatkowo pozwala określić jaki użytkownik, jaka aplikacja i z jakiego komputera wykonano zmiany.

  1. Uruchom ApexSQL Log
  2. Podłącz się do działającej bazy danych, w której skasowano rekordy.

    Connecting to the database in ApexSQL Log

  3. Jeżeli utworzone były kopie zapasowe logu transakcyjnego, to dodaj je przyciskiem Add w kolejnym kroku. Zwróć uwagę, że kopie zapasowe logów transakcyjnych muszą tworzyć pełen łańcuch logów, jeżeli rekordy, które chcesz odzyskać zawierają dane typu BLOB (zobacz poniżej szczegóły).
  4. Możesz także skorzystać z odłączonego logu transakcyjnego, który zawiera informacje o skasowanych rekordach (na przykład, jeżeli przeniosłeś bazę danych w tryb offline i skopiowałeś plik LDF zaraz po skasowaniu rekordów):

    Select log data source file

  5. Możesz użyć sekcji Time range w opcjach Filter setup, aby zawęzić wyszukiwanie transakcji w logu transakcyjnym.

    Filtering transactions by time range

  6. Użyj filtru Operations aby zawęzić przeszukiwanie logu tylko do rekordów skasowanych. W tym celu usuń zaznaczenie dla wszystkich działań na obiektach (DDL) oraz dla poleceń Insert row i Update row na liście Data operations (DML).

    Choosing deleted SQL records only

  7. Jeśli to możliwe, określ tablice, z których zostały skasowane rekordy. Jeżeli nie, zaznacz wszystkie tablice.

    Specifying the records from which the records have been deleted

  8. Kliknij Open
  9. Wszystkie SKASOWANE transakcje zostaną wyświetlone w oknie głównym narzędzia. Pozostaje już tylko kliknąć polecenie Create Undo Script w menu, aby utworzyć skrypt wycofujący skasowanie rekordów.

    Create Undo Script in ApexSQL Log

  10. Aby utworzyć skrypt tylko dla wybranych rekordów, należy je zaznaczyć a następnie w menu kontekstowym wybrać polecenie Create undo script.

    Zostanie utworzony skrypt, który wstawi do bazy danych skasowane wcześniej rekordy.

    Generated Undo Script

  11. Kliknij Run button w menu aby wykonać skrypt.

Użyj ApexSQL Log, aby utworzyć skrypt wycofujący zmiany

Opisana metoda, która najpierw wyświetla wynik w oknie jest akceptowalna dla małej liczby rekordów. Jeżeli odtwarzamy miliony skasowanych rekordów, efektywniejsze będzie utworzenie od razu skryptu wycofującego skasowanie rekordów, zamiast najpierw wyświetlać je w głównym oknie narzędzia. Kroki od 1 do 7 są takie same jak opisane powyżej.

  1. Zamiast wybrać opcję Open results in grid, kliknij Export results to a file.

    Export results to a file

  2. Wybierz Generate Rollback (UNDO) Script i określ ścieżkę do pliku.

    Generate Rollback (UNDO) Script

  3. Kliknij OK

    Zostanie utworzony skrypt wstawiający skasowane rekordy.

    Exporting finished

Użyj ApexSQL Recover

ApexSQL ma w swoim portfolio jeszcze jedno narzędzie: ApexSQL Recover , które pozwala czytać log transakcyjny baz danych SQL Server’a, zarówno log transakcyjny online, jak i log odłączony oraz kopie zapasowe logów (także te skompresowane). ApexSQL Recover umożliwia odzyskanie skasowanych, obciętych, uszkodzonych rekordów z danymi. Narzędzie pozwala odtworzyć obiekty i dane utracone na skutek operacji kasowania, także obiekty typu BLOB zapisywane jako pliki. Proces odtwarzania utraconych danych jest podobny do opisanego w bieżącym artykule, a szczegółowe kroki opisane są w artykule: Recover deleted SQL data from a backup or from online database files – Use ApexSQL Recover

  1. Uruchom ApexSQL Recover
  2. Wybierz Recover lost data due to a DELETE operation
  3. Określ instancję SQL Server’a, uwierzytelnianie i bazę danych, w której skasowano rekordy.
  4. Wybierz Several sources are available for the recovery
  5. Automatycznie wyświetlone zostaną log transakcyjny online, kopie zapasowe logów transakcyjnych oraz bazy danych. Można także dodać dodatkowe odłączony logi transakcyjne przy pomocy przycisku Add, jeśli zawierają informacje o skasowanych rekordach. Zauważ, że kopie zapasowe logów transakcyjnych muszą tworzyć pełny łańcuch logów
  6. Określ czas, kiedy rekordy zostały skasowane. Jeżeli nie pamiętasz, wybierz opcję Date and time are unknown.
  7. Wykorzystaj filtr tabel, aby zawęzić odtwarzanie rekordów tylko do konkretnych tabel.
  8. Kliknij Recover
  9. Zostanie utworzony skrypt, który wstawi skasowane wcześniej rekordy. Wykonaj skrypt.

Dzięki powyższej procedurze można odzyskać skasowane rekordy także w sytuacji, w której nie posiadamy kopii zapasowej bazy danych lub pełnego łańcucha kopii zapasowych logów transakcyjnych. Nie dotyczy to obiektów typu BLOB, których nie można odtworzyć jeśli nie istnieje pełny łańcuch kopii zapasowych logów transakcyjnych. Transakcje kasujące obiekty typu BLOB nie logują do logu samych kasowanych wartości, więc w celu ich odzyskania konieczne jest przejście przez cały łańcuch kopii zapasowych logów. Jeśli łańcuch ten jest przerwany, to rekonstrukcja skasowanych danych może się nie udać. Na przykład w sytuacji, kiedy zagubiona jest informacja o aktualizacji danej typu BLOB, zostanie odtworzona oryginalnie wstawiona dana BLOB, a nie dana, która faktycznie została skasowana.

Możliwość odtworzenia danych istnieje także w przypadku baz danych, działających w trybie Simple recovery. W modelu Simple recovery nowe transakcje logowane do logu transakcyjnego nadpisują poprzednie transakcje. Jeżeli log transakcyjny zajmuje 100GB, a codziennie logujemy 1GB informacji o działaniach na bazie, to log transakcyjny zapełni się dopiero po 100 dniach. Co oznacza, że przypadkowo skasowane dane można usunąć w ciągu 100 dni od momentu skasowania.

Oczywiście nie oznacza to, że należy ten sposób odzyskiwania traktować jako typową procedurę postępowania. Po pierwsze należy pamiętać o przygotowaniu standardowej strategii tworzenia kopii zapasowych baz danych i logów oraz o strategii odtwarzania danych.

ApexSQL dostarcza dwa narzędzia, umożliwiające wykorzystanie logów transakcyjnych. ApexSQL Log posiada więcej opcji filtrowania oraz umożliwia działania na większym poziomie szczegółowości – oprócz filtrowania transakcji w logu transakcyjnym po czasie i nazwach tabel – co jest wspólną cechą obydwu narzędzi, pozwala filtrować tablice systemowe, rekordy w oparciu o konkretne wartości w kolumnach, konto użytkownika, który wykonał działanie kasowania rekordów. Dodatkowo, jeżeli w trakcie wykonywania kasowania działał ApexSQL Log Connection monitor, można filtrować transakcje po nazwie aplikacji i nazwie komputera użytego podczas kasowania.

ApexSQL Recover ma mnie opcji filtrowania, ale daje więcej opcji odtwarzania. Oprócz tworzenia skryptów T-SQL, które wstawiają rekordy, pozwala na utworzenie nowej bazy i odtworzenie rekordów do tej bazy.

Tłumacz: Anna Lesniak

November 4, 2015