Come recuperare una singola tabella da un backup di un database SQL Server

Se si chiede ai DBA quale caratteristica gli piacerebbe principalmente vedere aggiunta alle funzionalità di ripristino di SQL Server, sicuramente essi risponderebbero: “La possibilità di recuperare una tabella singola dal backup di un database”.

Naturalmente, è possibile recuperare i dati di una tabella specifica dal backup di un database, ma non si può fare senza ripristinare l’intero backup.

Perché i DBA vogliono questo? Bene, le ragioni sono molto semplici:

  1. Più spesso che il contrario, capita che il resto del database sia sano mentre qualcuno ha accidentalmente danneggiato o cancellato una singola tabella.
  2. Ripristinare un intero backup può comportare un significativo lasso di tempo e generalmente, quando una tabella è stata danneggiata in modo tale da richiedere un restore, il DBA probabilmente verrà incitato a fare più in fretta possibile.

Se dovessimo indovinare perché Microsoft non ha previsto questa funzionalità, potremmo dire che probabilmente dipende da questioni di integrità. Se si estrae soltanto una tabella da un backup il quale non è allineato al nostro database in linea, si potrebbe compromettere l’integrità referenziale.
Naturalmente questo è vero anche se si ripristina l’intero backup del database e poi si copiano le tabelle specifiche, così, in ogni caso, si tratta di qualcosa da prendere sempre in considerazione quando si effettua il recupero di una singola tabella.

Nel diagramma sottostante sono illustrati i passi che devono essere effettuati per recuperare una singola tabella da un backup:

Diagram of the steps to take to recover a single table from a backup

  1. Ripristinare il backup più recente e tutti i file di backup del log fino al punto in cui si sa che i dati erano corretti, in un database con un nome differente sullo stesso server

    Questa è la parte del processo che probabilmente richiede più tempo per essere completata, a seconda della dimensione del database

    Se servono solamente i dati da un paio di tabelle, potrebbe essere più rapido usare ApexSQL Recover per estrarre i dati delle tabelle in un nuovo database invece di dover ripristinare l’intero backup. Ti mostreremo come fare più avanti nell’articolo.

  2. Copiare i dati dal backup al database di destinazione

    A seconda dello scenario in questione, si può utilizzare una delle seguenti tecniche:

    1. Se la tabella è ancora esistente, e soltanto poche righe devono essere cancellate

      Usare l’istruzione INSERT combinata con SELECT per inserire soltanto le righe mancanti di nuovo dentro la tabella

      USE AdventureWorks2012
      GO
      SET IDENTITY_INSERT Production.Illustration ON
      INSERT INTO Production.Illustration 
      (IllustrationID,Diagram,ModifiedDate)
      SELECT * FROM AdventureWorks2012_Restored.Production.Illustration
      SET IDENTITY_INSERT Production.Illustration OFF
      
    2. Se la tabella è stata completamente eliminata

      Usare l’istruzione SELECT INTO per copiare la riga e la struttura della tabella di nuovo nel database

      USE AdventureWorks2012
      GO
      SELECT * INTO Production.Illustration 
      FROM AdventureWorks2012_Restored.Production.Illustration
    3. Se poche righe sono state danneggiate per esempio con un update doloso o qualche altro evento non desiderato

      L’istruzione MERGE può essere usata per aggiornare le righe danneggiate or inserire i dati mancanti o anche cancellare righe che non ci dovrebbero essere

      USE AdventureWorks2012
      GO
      SET IDENTITY_INSERT Production.Illustration ON
      MERGE Production.Illustration dest
      USING (SELECT * FROM AdventureWorks2012_Restored.Production.Illustration src) AS src
                    ON dest.IllustrationID = src.IllustrationID
      WHEN MATCHED THEN UPDATE 
      SET dest.Diagram = src.Diagram, dest.ModifiedDate = src.ModifiedDate
      WHEN NOT MATCHED THEN INSERT
      (IllustrationID,Diagram,ModifiedDate) VALUES 
      (src.IllustrationID,src.Diagram,src.ModifiedDate);
      SET IDENTITY_INSERT Production.Illustration OFF
  3. Ricreare ogni indice, trigger o constraint che sia richiesto
  4. Risolvere tutti i problemi di integrità referenziale

    Questo è un processo manuale e sfortunatamente non c’è modo di aggirarlo. Semplicemente deve essere fatto

  5. Eseguire il comando DBCC CHECKTABLE sulla tabella per verificare l’integrità dei dati

    DBCC CHECKTABLE ("Production.Illustration")

Come promesso in precedenza, illustreremo adesso come usare ApexSQL Recover per estrarre questi dati dalla tabella senza fare un ripristino completo di un database

  1. ApexSQL recover offre un paio di opzioni per recuperare una tabella. Più informazioni si hanno sull’evento che si è verificato, più facile sarà ottenere la tabella di nuovo usando ApexSQL Recover

    Se si conosce che la tabella è stata eliminata da un comando DROP TABLE o usando SSMS, si può usare l’opzione di ripristino dei dati persi, l’operazione From DROP TABLE. Questo consente a ApexSQL Recover di trovare i dati velocemente, in quanto il programma deve solo cercare le tabelle eliminate.

    Proviamo a scegliere questa opzione adesso

  2. Ti sarà richiesto di collegarti al database di SQL Server dal quale la tabella è stata cancellata.

  3. Fornisci i dettagli per la connessione
  4. Clicca Next

    Questo schermo ci consente di aggiungere qualsiasi backup di database che possiamo avere. Se non ci sono backup disponibili, ApexSQL Recover proverà soltanto a recuperare i dati dal database a cui ci stiamo collegando attualmente

    A seconda di quanto tempo fa la tabella è stata eliminata, poche informazioni possono essere ancora disponibili nel database di SQL Server stesso. Se ci sono dei backup disponibili, dovresti aggiungerli, questo non soltanto accelererà il recupero dei dati ma anche migliorerà la qualità dei dati restituiti.

  5. Seleziona l’opzione Add transaction logs

  6. Aggiungi tutti i backup disponibili

  7. Clicca Next

    Se conosci il momento approssimativo in cui si è verificato l’evento, scegli l’opzione pertinente. Dare un momento approssimativo accelererà l’operazione

  8. Seleziona l’opzione più pertinente

  9. Clicca Next

    ApexSQL Recover ti consente di scrivere i dati estratti in un file di script o di estrarli in un nuovo database

  10. Seleziona l’azione di recupero

  11. Specifica il nome del database di SQL Server da creare, se applicabile

  12. Clicca Next

    Here you can choose to recover either the structure and the data, or only the table structure

  13. Seleziona la tua opzione di recupero
  14. Clicca Recover

    Uno schermo con l’esito finale apparirà per mostrare quali tabelle sono state recuperate

In conclusion

Quando qualcosa va male ed una tabella viene accidentalmente eliminata o troncata, potresti non avere abbastanza tempo per ripristinare l’intero database. Quando succede questo, ApexSQL Recover è la risposta.

ApexSQL Recover può identificare i dati associati ad una singola tabelle ed estrarre soltanto i dati pertinenti dai backup nativi di SQL Server, eliminando il bisogno di un dispendioso, in termini di tempo, backup completo.

Downloads

Per favore scaricate gli script(s) associati con questo articolo dal nostro repository GitHub.

Per favore contattateci per qualsiasi problema o domanda con gli scripts.

 

July 25, 2017