Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

ROLLBACK TRUNCATE in SQL Server

Haben Sie jemals versehentlich TRUNCATE ausgeführt Befehl auf einem falschen Tisch? Dies führt zu allen Datenverlusten. Das Schlimmste ist, dass Sie keine Chance haben, Ihre Daten zurückzubekommen. In diesem Artikel sehen wir uns an, wie Sie solche Situationen vermeiden und die Möglichkeit haben, TRUNCATE ROLLBACK zu machen .

Sie können TRUNCATE nicht ROLLBACKEN

Sie können eine Transaktion einfach nicht rückgängig machen, wenn sie bereits festgeschrieben ist, aber Sie können etwas anderes tun, um die Daten zurückzubekommen (oder zumindest einige Teile davon).

Wenn Sie TRUNCATE ausführen Anweisung befinden sich Ihre Daten noch in der MDF-Datei. Es ist jedoch nicht sichtbar, da SQL Server dies als freien Speicherplatz behandelt (TRUNCATE weist SQL Server an, Datenseiten freizugeben).

Die einzige Möglichkeit, die Daten zurückzubekommen, besteht darin, freigegebene Datenseiten irgendwie zu lesen und sie in lesbare Daten umzuwandeln.

Sie müssen schnell handeln, da freier Speicherplatz mit neuen Daten überschrieben wird, falls dies noch nicht geschehen ist. Wenn Sie Ihre SQL Server-Instanz stoppen und eine Kopie der MDF- und LDF-Dateien erstellen könnten, würden Sie mehr Zeit gewinnen.

Es gibt einige Tools, die diese Art der Wiederherstellung durchführen können.

Sie können TRUNCATE ROLLBACKEN

KÜRZEN ist ein protokollierter Vorgang, aber SQL Server protokolliert nicht jede einzelne Zeile, da er die Tabelle KÜRZT. SQL Server protokolliert nur die Tatsache, dass das TRUNCATE Operation passiert ist. Es protokolliert auch die Informationen über die Seiten und Extents, die freigegeben wurden. Es gibt jedoch genügend Informationen, um ein Rollback durchzuführen, indem Sie diese Seiten einfach neu zuweisen. Eine Log-Sicherung benötigt nur die Information, dass die TRUNCATE TABLE aufgetreten. So stellen Sie die TRUNCATE TABLE wieder her , wird die Operation einfach erneut angewendet. Die betroffenen Daten werden während der WIEDERHERSTELLUNG nicht benötigt (wie es bei einer echten „minimal protokollierten“ Operation wie einem BULK INSERT der Fall wäre ).

SQL Server weiß, welche Seiten zu der Tabelle gehörten, sofern sie mit einer exklusiven Sperre gesperrt sind, und wie alle X-Sperren werden sie bis zum Ende der Transaktion gehalten. Aus diesem Grund können Seiten oder Extents nicht freigegeben und schon gar nicht wiederverwendet werden.

Hier ist ein Beispiel:

Wir haben 504 Zeilen und eine Anzahl von Seiten gezählt. Jetzt sehen wir uns die Anzahl der Zeilen und die Seiten an, die zur Tabelle gehören.

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');

Sie sehen keine Zeilen von DBCC IND , und 0 Zeilen von count(*). Die Informationen zu den Sperren geben Folgendes zurück:

Ressourcentyp Ressourcenbeschreibung Anfragemodus
————- ——————– ————
UMFANG 1:33352 X
SEITE 1:42486 X
UMFASSUNG 1:42488 X
SEITE 1:42487 X
SEITE 1:42488 X
SEITE 1:42489 X
SEITE 1:23027 X
SEITE 1:23030 X
SEITE 1:23029 X
SEITE 1:26992 X
SEITE 1:26993 X

Die Extent- und Seitensperren umfassen alle Seiten, die wir in DBCC IND gesehen haben Ausgang. Erst nach einem ROLLBACK Durch die Transaktion werden die Sperren freigegeben, und Sie sollten alle Zeilen und Seiten wieder in der Tabelle sehen.

ROLLBACK TRAN;
GO
SELECT COUNT(*) FROM dbo.Products;
DBCC IND('AdventureWorks', 'Products', -1);
GO

Seien Sie vorsichtig und schließen Sie die TRUNCATE-Tabellenanweisung immer in die Transaktion ein.