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:
- Più spesso che il contrario, capita che il resto del database sia sano mentre qualcuno ha accidentalmente danneggiato o cancellato una singola tabella.
- 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:
-
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.
-
Copiare i dati dal backup al database di destinazione
A seconda dello scenario in questione, si può utilizzare una delle seguenti tecniche:
-
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
-
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
-
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
-
- Ricreare ogni indice, trigger o constraint che sia richiesto
-
Risolvere tutti i problemi di integrità referenziale
Questo è un processo manuale e sfortunatamente non c’è modo di aggirarlo. Semplicemente deve essere fatto
-
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
-
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
-
Ti sarà richiesto di collegarti al database di SQL Server dal quale la tabella è stata cancellata.
- Fornisci i dettagli per la connessione
-
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.
-
Seleziona l’opzione Add transaction logs
-
Aggiungi tutti i backup disponibili
-
Clicca Next
Se conosci il momento approssimativo in cui si è verificato l’evento, scegli l’opzione pertinente. Dare un momento approssimativo accelererà l’operazione
-
Seleziona l’opzione più pertinente
-
Clicca Next
ApexSQL Recover ti consente di scrivere i dati estratti in un file di script o di estrarli in un nuovo database
-
Seleziona l’azione di recupero
-
Specifica il nome del database di SQL Server da creare, se applicabile
-
Clicca Next
Here you can choose to recover either the structure and the data, or only the table structure
- Seleziona la tua opzione di recupero
-
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