Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

ROLLBACK TRUNCATE in SQL Server

Hai mai eseguito accidentalmente il TRUNCATE comando su una tabella sbagliata? Ciò comporterà la perdita di tutti i dati. La cosa peggiore è che non avrai la possibilità di recuperare i tuoi dati. In questo articolo, daremo un'occhiata a come evitare tali situazioni e avremo la possibilità di ROLLBACK TRUNCATE .

Non puoi eseguire il ROLLBACK TRUNCATE

Semplicemente, non puoi eseguire il rollback di una transazione se è già stata impegnata, ma puoi fare qualcos'altro per recuperare i dati (o almeno alcune parti di essi).

Quando esegui TRUNCATE dichiarazione, i tuoi dati sono ancora nel file MDF. Tuttavia, non è visibile perché SQL Server lo considera come spazio libero (TRUNCATE sta dicendo a SQL Server di deallocare le pagine di dati).

L'unico modo per recuperare i dati è in qualche modo leggere le pagine di dati deallocate e convertirle in dati leggibili.

Devi agire in fretta perché lo spazio libero verrà sovrascritto con nuovi dati se non già. Se riesci a interrompere l'istanza di SQL Server ed eseguire una copia dei file MDF e LDF, ciò ti farebbe guadagnare più tempo.

Esistono alcuni strumenti che possono eseguire questo tipo di ripristino.

Puoi ROLLBACK TRUNCARE

TRONCA è un'operazione registrata, ma SQL Server non registra ogni singola riga poiché TRUNCATE la tabella. SQL Server registra solo il fatto che TRUNCATE operazione avvenuta. Registra anche le informazioni sulle pagine e sugli extent che sono stati deallocati. Tuttavia, ci sono abbastanza informazioni per tornare indietro, semplicemente riassegnando quelle pagine. Un backup del registro richiede solo le informazioni contenute in TRUNCATE TABLE si è verificato. Per ripristinare il TRUNCATE TABLE , l'operazione è appena stata riapplicata. I dati coinvolti non sono necessari durante il RESTORE (come sarebbe per una vera operazione "minimamente registrata" come un INSERTO BULK ).

SQL Server sa quali pagine appartenevano alla tabella nella misura in cui sono bloccate con un blocco esclusivo e, proprio come tutti i blocchi X, vengono mantenute fino alla fine della transazione. Ecco perché le pagine o le estensioni non possono essere deallocate e, di certo, non possono essere riutilizzate.

Ecco un esempio:

Abbiamo un conteggio di 504 righe e un numero di pagine. Ora esamineremo il conteggio delle righe e le pagine che appartengono alla tabella.

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

Non vedrai righe da DBCC IND e 0 righe da count(*). Le informazioni sui blocchi restituiscono quanto segue:

tipo_risorsa descrizione_risorsa modalità_richiesta
————- ——————– ————
EXTENT 1:33352 X
PAGE 1:42486 X
EXTENT 1:42488 X
PAGINA 1:42487 X
PAGINA 1:42488 X
PAGINA 1:42489 X
PAGINA 1:23027 X
PAGINA 1:23030 X
PAGINA 1:23029 X
PAGINA 1:26992 X
PAGINA 1:26993 X

L'estensione e i blocchi di pagina includono tutte le pagine che abbiamo visto nel DBCC IND produzione. Solo dopo il ROLLBACK la transazione verrà sbloccata e dovresti vedere di nuovo tutte le righe e le pagine sulla tabella.

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

Fai attenzione e avvolgi sempre l'istruzione della tabella TRUNCATE nella transazione.