Recuperare dati cancellati da un log delle transazioni su SQL Server

In Recuperare dati da un backup o da un database online su SQL Server, abbiamo mostrato due scenari di recupero, uno da un backup completo di un database ed l’altro direttamente dai file del database online (i file MDF). Oltre a queste vi è una ulteriore possibilità, accedere al log delle transazioni.

Ogni cambiamento di schema e di dati in un database SQL Server viene registrato nel file di log delle transazioni online nella forma di un “record” di log. Se si volessero ripristinare le transazioni ormai cancellate, inoltre, si dovrebbe disporre di un file di log scollegato o di un backup del log delle transazioni dai quali leggerle.

In base alla modalità di recupero avremo:

  • Completa: le transazioni cancellate sono ancora all’interno di un log delle transazioni online oppure in un suo backup
  • Registrazione minima delle operazioni di bulk: le transazioni cancellate sono completamente registrate nel log delle transazioni eccetto per i BLOB eliminati. Un BLOB eliminato ed un BLOB inserito non sono registrati
  • Semplice: le transazioni eliminate potrebbero non essere più disponibili nel log delle transazioni (a causa anche di un alto traffico su database). In questo caso, prima si legge il log online, migliori sono le possibilità di recuperare le transazioni cancellate


Utilizzare ApexSQL Log

Per leggere un log delle transazioni di un database online, oppure log delle transazioni scollegati, o ancora backup dei log (sia compressi che non) utilizzare ApexSQL Log. Esso è un lettore di log delle transazioni per SQL Server che fornisce audit, annullamenti e ripetizioni di operazioni relative a cambiamenti sui dati e sullo schema dei nostri database, occorsi anche prima dell’installazione del tool. Cattura inoltre informazioni relative all’utente che ha eseguito le operazioni, l’applicazione che ha eseguito e l’host utilizzato per i cambiamenti.

  1. Eseguire ApexSQL Log
  2. Connettersi sul database su cui si vuole effettuare l’analisi

  3. Nel caso in cui esistano backup del log delle transazioni (create dopo le cancellazioni di cui si sta cercando traccia), aggiungerli con il tasto Add. L’importante è caricare una catena di log completa
  4. Nel caso in cui esista un file di log delle transazioni scollegato che potrebbe contenere la cancellazione, è possibile utilizzare anch’esso:

  5. Utilizzare la sezione Time range in Filter setup per migliorare la ricerca all’interno di un intervallo ben specificato

  6. Utilizzare il filtro Operations per affinare i risultati filtrandoli per tipo di operazione (cancellazione). Per fare ciò è sufficiente deselezionare DDL così come Insert row e Update row nella lista Data operations (DML)

  7. Se possibile, specificare anche le tabelle interessate dall’operazione di cancellazione. In caso contrario, lasciarle selezionate tutte

  8. Premere Open
  9. Tutte le transazioni di DELETE sono mostrate nella griglia principale. È sufficiente selezionare le righe per cui creare lo script di undo e premere Create Undo Script nel menu

  10. Per creare uno script di undo su tutti i risultati premere il tasto di cui al punto precedente senza deselezionare tighe, mentre per crearlo per alcuni oggetti, selezionarli ed eseguire Create undo script dal menu contestuale

    Lo script che crea gli inserimenti relative alle cancellazioni verrà creato.

    Generated Undo Script

  11. Per eseguirlo, premere il pulsante nel menu


Utilizzare ApexSQL Log to create an undo script immediately

Il metodo descritto precedentemente è molto efficace nei casi in cui i risultati non siano tanti. Quando si ha a che fare con milioni di record cancellati, raccomandiamo la creazione immediata di uno script di undo, in modo da saltare le parti in cui i risultati sono mostrati. Gli step da 1 a 7 sono validi anche in questo caso. Successivamente:

  1. Non selezionare Open results in grid, ma Export results to a file

  2. Selezionare Generate rollback (undo) script e specificare nome e percorso

  3. Premere OK

    Lo script contenente le insert relative alle cancellazioni verrà creato su file.

    Exporting finished

Utilizzare ApexSQL Recover

Vi è un altro tool di ApexSQL che può leggere log delle transazioni di SQL Server (online, scollegato, backup di log compressi o meno) ed il suo nome è ApexSQL Recover. Esso è uno strumento di recupero per database SQL Server, il quale consente il recupero di dati cancellati, corrotti oppure danneggiati. Recupera dati ed oggetti persi a causa di operazioni di drop non desiderate e ripristina sia i BLOB cancellati che online come file. Il processo di recupero è piuttosto simile ed è descritto qui: Recover deleted SQL data from a backup or from online database files – Use ApexSQL Recover.

  1. Eseguire ApexSQL Recover
  2. Selezionare Recover lost data due to a DELETE operation
  3. Specificare server, istanza, database e credenziali
  4. Selezionare Several sources are available for the recovery
  5. La lista dei backup del log delle transazioni, dei backup del database e il log delle transazioni online saranno mostrati in automatico. Per aggiungerne altri, utilizzare il pulsante Add. L’importante è caricare una catena di log completa
  6. Specificare l’intervallo di date in cui la cancellazione è stata eseguita. Se non si è a conoscenza di questo, selezionare Date and time are unknown
  7. Utilizzare il filtro su tabelle per determinare gli oggetti di destinazione, se conosciuti
  8. Premere Recover
  9. Lo script verrà creato, eseguirlo

La buona notizia è che è possibile recuperare i dati senza un ripristino di un backup del database (o da una catena di backup di log) Da notare che il recupero di BLOB cancellati è possibile solo in caso di presenza di una catena completa di log di transazioni. Questo poiché il BLOB cancellato non viene registrato con il suo valore cancellato. Quindi è necessario avere la catena completa per ricostruirne la storia. In caso di rottura della catena, la ricostruzione di un BLOB potrebbe essere errata. Ad esempio, se la catena si interrompe e se si perde l’informazione relativa ad un aggiornamento del BLOB, esso verrà creato alla sua versione precedente.

Anche se il database ha un modello di recupero semplice, c’è una possibilità di effettuare un recupero con successo. In questa modalità SQL Server sovrascrive il log delle transazioni riutilizzando la parte più vecchia del file di log delle transazioni. Ad esempio, se un log delle transazioni di un database online è di 100GB, e se ogni giorno viene registrata una quantità di transazioni pari ad 1GB, dopo 100 giorni il log verrà piano piano sovrascritto (a partire dalle transazioni più vecchie). Questo significa anche che, in questo esempio, è possibile recuperare dati fino a 100 giorni prima dell’esecuzione del tool.

Di certo, non bisogna pensare che è possibile dimenticarsi di una strategia di disaster recovery.

ApexSQL ha due tool che possono aiutarci con il log delle transazioni.

ApexSQL Log, fornisce più opzioni di filtro e granularità nel recupero dei dati (oltre al filtro per data consente di filtrare le tabelle di sistema, i record basati su certi volumi, le descrizioni delle transazioni, l’utente, l’host e l’applicazione).

ApexSQL Recover ha meno opzioni di filtro, ma fornisce maggiori informazioni per i risultati. Oltre che dare la possibilità di creare uno script T-SQL che reinserisce i record cancellati, può anche creare nuovi database e recuperare i dati cancellati direttamente su di esso.

Traduttore: Alessandro Alpi

October 1, 2014