it-swarm.dev

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

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?

49
user755

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 dziennika, 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.

118
Brent Ozar

SQL Server przechowuje dzienniki dla każdego usuniętego rekordu. Możesz przeszukiwać te dzienniki za pomocą fn_dblog Funkcja SQL 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/

30
user1059637

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

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ę wydarzyło, niż gorączkowo próbować dojść do siebie 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.

22
jcolebrand