Jak mogę odzyskać niektóre usunięte rekordy?

49

Przez pomyłkę usunąłem około 2 000 000 rekordów ze zdalnej tabeli SQL Server 2008. Serwer nie przyznaje mi dostępu do plików kopii zapasowych po stronie serwera.

Czy jest jakiś sposób na odzyskanie tych zapisów?

Nick Chammas
źródło
18
Kiedy ostatni raz testowałeś swoje kopie zapasowe?
Joe
20
Kiedy ostatni raz testowałeś PRZYWRACANIE swoich kopii zapasowych?
datagod 23.11.11

Odpowiedzi:

116

Czy Twoja baza danych jest w trybie pełnego odzyskiwania?

  • Jeśli tak, czy wykonujesz kopie zapasowe dziennika transakcji?

    • Jeśli tak, czy masz narzędzie do tworzenia kopii zapasowych, takie jak Quest LiteSpeed, Red Gate SQL Backup lub Idera SQLSafe?
      • Jeśli tak, narzędzia te mogą usuwać obiekty z plików kopii zapasowych (w tym pełne i dzienniki transakcji) - ale wyjaśnienie, jak z nich korzystać, wykracza poza zakres tego, co mogę tutaj zrobić. Skontaktuj się ze sprzedawcą w celu uzyskania instrukcji.
      • Jeśli nie, przywróć pełną kopię zapasową i dzienniki transakcji jako bazę danych o innej nazwie. (Nie nadpisuj istniejącej bazy danych.) Będziesz mógł uzyskać do drugiej kopii obiektu przed usunięciem, ale musisz użyć części stopat polecenia restore, aby określić kiedy przestać przywracać polecenia. Musisz zatrzymać się przed usunięciem.
    • Jeśli nie, weź kopię narzędzia do odczytu dzienników, takiego jak Quest LiteSpeed ​​lub Apex SQL Log. Te narzędzia mogą łączyć się z serwerem bazy danych, sprawdzać plik dziennika i pomagać w cofaniu transakcji. Nie jestem pewien, czy wersje demo będą działać, ale te z pewnością będą działać.
  • Jeśli nie (nie w trybie pełnego odzyskiwania), przywróć ostatnią pełną kopię zapasową jako bazę danych o innej nazwie. (Nie nadpisuj bazy danych, którą już masz.) Stamtąd będziesz mógł przywrócić wszystkie rekordy, które były w trybie online w momencie tworzenia kopii zapasowej, ale stracisz wszystkie zmiany od tego czasu.

Brent Ozar
źródło
4
Świetna odpowiedź, dodam, że jeśli masz audyt lub śledzenie zmian, zwykle najłatwiej jest odzyskać dane z tych tabel, jeśli dotyczy to tylko jednej tabeli. I oczywiście, jeśli Twoja odpowiedź brzmiała „nie” na niektóre lub wszystkie powyższe pytania, po przywróceniu rekordów w jak największym stopniu, to napraw proces tworzenia kopii zapasowej i prawdopodobnie kto ma dostęp do danych produkcyjnych.
HLGEM,
Jeśli jesteś w trybie prostym, wiersze mogą być fizycznie obecne na niektórych stronach. Być może niektóre z nich można odzyskać (przy bardzo wysokich kosztach czasu i / lub pieniędzy).
usr
Do Twojej wiadomości ApexSQL Odzyskaj oprócz ograniczenia czasowego, wersja ewaluacyjna odzyskuje tylko 1 na każde 10 wierszy wszystkich wierszy dostępnych do odzyskania ( apexsql.com/faqs/faqs_recover.aspx )
Sameer
30

SQL Server przechowuje dzienniki dla każdego usuniętego rekordu. Możesz przeszukiwać te dzienniki za pomocą funkcji fn_dblogSQL Server.

SELECT [RowLog Contents 0] 
FROM   sys.fn_dblog(NULL, NULL) 
WHERE  
       AllocUnitName = 'dbo.TableName'        
   AND Context IN ( 'LCX_MARK_AS_GHOST', 'LCX_HEAP' )        
   AND Operation in ( 'LOP_DELETE_ROWS' )   
;

Ale ten dziennik jest w formacie szesnastkowym i musisz przekonwertować ten format szesnastkowy na rzeczywiste dane.

Poniższy artykuł pomoże ci odzyskać usunięte rekordy w sposób określony powyżej:

http://raresql.com/2011/10/22/how-to-recover-deleted-data-from-sql-sever/

użytkownik1059637
źródło
3
To jest całkiem niezłe. Na jakich warunkach to podejście działa (lub nie działa)?
Nick Chammas,
3
@NickChammas - może odzyskać tylko to, co jest w aktywnym dzienniku, więc w przypadku prostego modelu odzyskiwania nie może wystąpić punkt kontrolny. Wygląda też na to, że obecnie nie działa poprawnie w bazach danych z izolacją migawek, ale powinno to być łatwe. @user1059637- Jakie jest Twoje podejście do osób dodających funkcjonalność do Twojego kodu?
Martin Smith
@MartinSmith, teraz działa idealnie również z izolacją migawek.
user1059637
22

Niestety nie będziemy w stanie pomóc bez większej ilości informacji. Ale z twojego pytania wynika, że ​​usunąłeś z bazy danych 2 miliony rekordów. Najprawdopodobniej nie możesz odzyskać tych informacji, chyba że masz pełne logowanie do bazy danych i kupisz jakieś bardzo konkretne narzędzia.

Jeśli możesz opisać bardziej szczegółowo, co według Ciebie zrobiłeś i dlaczego uważasz, że nie możesz odzyskać zapisów, i możesz opisać organizację Twojej bazy danych, możemy ci pomóc nieco więcej.

Kilka ogólnych rad: jeśli uważasz, że usunąłeś 2 miliony rekordów, prawdopodobnie jesteś teraz trochę przerażony. Powinieneś więc zrobić pięciominutową przerwę, uspokoić się i wrócić do problemu. Powinieneś także natychmiast powiedzieć swojemu szefowi, czy jest to uzasadnione (nie budź kogoś o 2 nad ranem, żeby mu powiedzieć) i że pracujesz nad rozwiązaniem. Lepiej przyznać się do tego, co się stało, niż gorączkowo spróbować odzyskać zdrowie i potencjalnie pogorszyć sytuację i ukryć szczegóły. Wiedza, że ​​twój szef może w jakiś sposób pomóc, pomaga rozwiązać problem. Tak jak powiedziałem, tylko kilka ogólnych rad.

jcolebrand
źródło
10
dobry pomysł z 5-minutową przerwą. Zawsze działa. Pomaga się skupić. :-) Zostałem tam zrobiony.
John aka hot2use,