Czy kiedykolwiek przypadkowo wykonałeś OBCIĄŻENIE polecenie na złym stole? Doprowadzi to do utraty wszystkich danych. Najgorsze jest to, że nie będziesz miał szansy na odzyskanie swoich danych. W tym artykule przyjrzymy się, jak uniknąć takich sytuacji i mieć szansę na COFANIE OBCIĄŻENIA .
Nie można WYCOFAĆ OBCIĄŻENIA
Po prostu nie możesz wycofać transakcji, jeśli jest już zatwierdzona, ale możesz zrobić coś innego, aby odzyskać dane (lub przynajmniej niektóre z nich).
Po wykonaniu OBCIĄŻENIA oświadczenie, Twoje dane nadal znajdują się w pliku MDF. Nie jest to jednak widoczne, ponieważ SQL Server traktuje to jako wolne miejsce (OBNIŻENIE mówi SQL Serverowi, aby cofnął alokację stron danych).
Jedynym sposobem na odzyskanie danych jest odczytanie w jakiś sposób zwolnionych stron danych i przekształcenie ich w czytelne dane.
Musisz działać szybko, ponieważ wolne miejsce zostanie nadpisane nowymi danymi, jeśli jeszcze nie. Jeśli możesz zatrzymać instancję SQL Server i wykonać kopię plików MDF i LDF, które dadzą Ci więcej czasu.
Istnieje kilka narzędzi, które mogą wykonać tego rodzaju przywracanie.
Możesz WYCOFAĆ OBCIĄŻENIE
OBCIĄGNIJ jest operacją rejestrowaną, ale SQL Server nie rejestruje każdego wiersza, ponieważ obcina tabelę. SQL Server rejestruje tylko fakt, że OBNIŻENIE operacja się wydarzyła. Rejestruje również informacje o stronach i zakresach, które zostały cofnięte. Jest jednak wystarczająco dużo informacji, aby cofnąć, po prostu ponownie przydzielając te strony. Kopia zapasowa dziennika wymaga tylko informacji, które TRUNCATE TABLE wystąpił. Aby przywrócić TRUNCATE TABLE , operacja została właśnie zastosowana ponownie. Zaangażowane dane nie są potrzebne podczas PRZYWRACANIA (tak jak w przypadku prawdziwej operacji „minimalnie rejestrowanej”, takiej jak WSTAWIENIE ZBIORCZE ).
SQL Server wie, które strony należały do tabeli, o ile są one blokowane blokadą na wyłączność i podobnie jak wszystkie blokady X, są utrzymywane do końca transakcji. Dlatego nie można cofnąć alokacji stron ani zakresów, a już na pewno nie można ich ponownie wykorzystać.
Oto przykład:
Mamy 504 rzędy i kilka stron. Teraz przyjrzymy się liczbie wierszy i stronom, które należą do tabeli.
BEGIN TRAN TRUNCATE TABLE dbo.Products; SELECT COUNT(*) FROM dbo.Products; DBCC IND('AdventureWorks', 'Products', -1); DBCC EXTENTINFO('AdventureWorks', 'Products', -1); SELECT resource_type, resource_description, request_mode FROM sys.dm_tran_locks WHERE resource_type IN ('EXTENT', 'PAGE') AND resource_database_id = DB_ID('AdventureWorks');
Nie zobaczysz żadnych wierszy z DBCC IND i 0 wierszy z count(*). Informacje o blokadach zwracają następujące informacje:
typ_zasobu opis_zasobu tryb_żądania
————- ——————— ————
ZAKRES 1:33352 X
STRONA 1:42486 X
ZAKRES 1:42488 X
STRONA 1:42487 X
STRONA 1:42488 X
STRONA 1:42489 X
STRONA 1:23027 X
STRONA 1:23030 X
STRONA 1:23029 X
STRONA 1:26992 X
STRONA 1:26993 X
Zakres i blokady stron obejmują wszystkie strony, które widzieliśmy w DBCC IND wyjście. Dopiero po COFNIJNIU transakcja spowoduje zwolnienie blokad i powinieneś ponownie zobaczyć wszystkie wiersze i strony w tabeli.
ROLLBACK TRAN; GO SELECT COUNT(*) FROM dbo.Products; DBCC IND('AdventureWorks', 'Products', -1); GO
Zachowaj ostrożność i zawsze umieszczaj instrukcję TRUNCATE w transakcji.