Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

ROLLBACK OBCIĄŻONY w SQL Server

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 3 sposoby na uzyskanie pierwszego dnia miesiąca w SQL Server

  2. Jak utworzyć listę rozdzielaną przecinkami za pomocą zapytania SQL?

  3. Kiedy zasada DRY nie ma zastosowania:operacje BITWISE w SQL Server

  4. Czy mogę mieć klucz obcy odwołujący się do kolumny w widoku w SQL Server?

  5. Symulacja CONNECT BY PRIOR Oracle w SQL Server