Informazioni sul funzionamento dei processi di ripristino e recupero dei backup in SQL Server
Le informazioni contenute in questo argomento sono rilevanti per tutti i database di SQL Server.
Per ripristino si intende il processo di copia dei dati da un backup e l'applicazione ai dati delle transazioni registrate per il relativo rollforward fino al punto di recupero di destinazione. Un backup dei dati o un backup differenziale contiene un numero di record del log delle transazioni sufficiente per consentire l'esecuzione del rollforward delle transazioni attive come parte del ripristino di ogni backup. Ogni backup contiene inoltre una parte del log sufficiente per consentire l'esecuzione del rollback delle transazioni di cui non è stato eseguito il commit per impostare il database in uno stato consistente dal punto di vista transazionale e utilizzabile. Il processo di rollforward delle eventuali transazioni di cui non è stato eseguito il commit e di attivazione della modalità in linea per il database è noto come recupero.
Set di rollforward
Il processo di applicazione delle modifiche registrate ai dati presenti in un database per aggiornare i dati a un momento successivo nel tempo viene denominato rollforward. Il set di tutti i dati ripristinati viene chiamato set di rollforward. Un set di rollforward viene definito ripristinando uno o più backup completi, ad esempio un backup del database o parziale o un set di backup del file. Se un'istruzione RESTORE specifica filegroup, file o pagine, nel set di rollforward verranno inclusi solo questi elementi. In caso contrario, nel set di rollforward verranno inclusi tutti i file del backup ripristinato. Se il backup completo contiene record di log, verrà eseguito il rollforward dei dati ripristinati utilizzando tale log.
[!NOTA]
Se durante il ripristino si specifica un filegroup, il ripristino includerà l'intero filegroup corrente, compresi eventuali file aggiunti al filegroup dopo l'esecuzione del backup. Per ulteriori informazioni, vedere Controllo della creazione di file aggiunti durante l'esecuzione del rollforward.
In caso di ripristino di un backup differenziale, se sono stati aggiunti file al database dopo la creazione della base differenziale, le pagine nel set di rollforward potrebbero essere sovrascritte con i dati del backup differenziale. Per ulteriori informazioni, vedere Utilizzo dei backup differenziali.
Il ripristino di un backup differenziale aggiorna una pagina solo se questa è inclusa nel set di rollforward e nel backup e l'istruzione RESTORE elenca la pagina o il relativo file oppure non indica alcun file o pagina.
Nei modelli di recupero con registrazione completa e con registrazione minima delle operazioni bulk, è necessario eseguire separatamente il backup del log. Dopo aver ripristinato i dati e, facoltativamente, i backup differenziali, in genere si ripristinano i backup del log successivi, per portare il database fino al punto di errore. Il ripristino di un backup del log comporta il rollforward di tutte le pagine incluse nel set di rollforward. Per ulteriori informazioni sui backup del log, vedere Utilizzo dei backup del log delle transazioni.
Sequenze di ripristino
Ogni scenario di ripristino viene implementato utilizzando uno o più passaggi, o operazioni, di ripristino che costituiscono una sequenza di ripristino. Ogni operazione corrisponde a una singola istruzione RESTORE Transact-SQL. Tale sequenza gestisce lo spostamento dei dati interessati attraverso uno o più passaggi di ripristino.
Per ulteriori informazioni sulle sequenze di ripristino Transact-SQL e sulla relativa costruzione, vedere Utilizzo di sequenze di ripristino per database di SQL Server.
Fasi di ripristino
Il ripristino è un processo costituito da più fasi. Tra le fasi possibili di un ripristino rientrano la copia dei dati, il rollforward e il rollback:
La fase di copia dei dati implica la copia di tutti i dati, del log e delle pagine di indice dai supporti di backup di un database ai file del database.
La fase di rollforward consiste nell'applicazione delle transazioni registrate ai dati copiati dal backup per eseguire il rollforward di tali dati fino al punto di recupero. A questo punto, un database dispone in genere di transazioni di cui non è stato eseguito il commit e si trova in uno stato non utilizzabile. In tal caso, è necessaria una fase di rollback per il recupero del database.
La fase di rollback, che rappresenta la parte iniziale del recupero, riguarda le transazioni di cui non è stato eseguito il commit e consente di rendere disponibile il database per gli utenti. Dopo la fase di rollback, non sarà possibile ripristinare i backup successivi.
Nelle parti rimanenti di questa sezione vengono illustrate queste fasi in modo più dettagliato.
Fase di copia dei dati
La prima fase di ogni processo di ripristino è la fase di copia dei dati. Durante tale fase viene inizializzato il contenuto del database, dei file o delle pagine da ripristinare e vengono eseguite operazioni di ripristino di tali elementi tramite backup completi o differenziali.
La fase di copia dei dati prevede la copia dei dati da uno o più backup completi e, facoltativamente, da backup differenziali e quindi il ripristino del contenuto del database, dei file o delle pagine interessati in base al momento dell'acquisizione in tali backup.
Il file o la pagina meno recente nel set di rollforward determina il punto di partenza per la fase successiva: il rollforward.
Fase di rollforward
Il rollforward è il processo di applicazione delle modifiche registrate ai dati del set di rollforward per aggiornarli a un momento successivo. Per eseguire il rollforward, Motore di database di SQL Server elabora i backup dei log non appena vengono ripristinati, iniziando dal log contenuto nei backup completi.
Durante il ripristino, il rollforward viene evitato se non è necessario. In genere, se i dati sono di sola lettura al momento dell'esecuzione del relativo backup e in seguito rimangono invariati, il rollforward non è necessario e viene ignorato.
Punto di recupero
L'obiettivo del rollforward è il ripristino dello stato originale dei dati al punto di recupero. Per punto di recupero si intende il punto specificato dall'utente per il recupero del set di dati. Con il modello di recupero con registrazione completa, è possibile indicare il punto di recupero come un punto specifico nel tempo, come una transazione contrassegnata o come un numero di sequenza del log. Con il modello di recupero con registrazione minima delle operazioni bulk, è possibile eseguire il ripristino in un punto nel tempo solo se non è stata eseguita alcuna operazione bulk dopo il precedente backup del log.
Consistenza di rollforward
Nella fase di rollforward, viene eseguito sempre il rollforward dei dati fino a un punto in cui è garantita la consistenza di rollforward con lo stato del database al punto di recupero. Viene eseguito il rollforward di tutti i dati fino a un punto in cui è possibile eseguire il rollback.
Lo stato del database viene definito dal file primario, come illustrato di seguito:
Se il file primario viene ripristinato, lo stato dell'intero database viene determinato dal punto di recupero. Se, ad esempio, un database viene recuperato fino a un punto specifico nel tempo immediatamente precedente all'eliminazione accidentale di una tabella, sarà necessario ripristinare l'intero database fino allo stesso punto.
Se il file primario non viene ripristinato, lo stato del database è noto e verrà eseguito il rollforward dei dati ripristinati fino a un punto di recupero consistente dal punto di vista transazionale con il database. Questo comportamento viene imposto da SQL Server.
Tuttavia, il database potrebbe includere modifiche apportate dalle transazioni di cui non è stato eseguito il commit al punto di recupero. Per il ripristino in linea, i dati vengono recuperati fino a un punto nel tempo consistente con lo stato corrente della parte in linea del database.
Per un backup differenziale viene considerato il momento della relativa esecuzione. Le pagine incluse nel set di rollforward vengono sovrascritte con quelle più recenti del backup differenziale.
Fase di rollback e recupero
Al termine del rollforward delle transazioni del log, il database contiene in genere le modifiche apportate dalle transazioni di cui non è stato eseguito il commit al punto di recupero. Per questo motivo, i dati di cui è stato eseguito il rollforward non sono consistenti dal punto di vista transazionale. Durante il processo di recupero viene aperto il log delle transazioni per identificare le transazioni di cui non è stato eseguito il commit e viene eseguito il rollback di tali transazioni, a meno che non siano presenti blocchi che impediscono la visualizzazione dei dati non consistenti dal punto di vista transazionale. Questo passaggio è detto fase di rollback. Se i dati sono già consistenti dal punto di vista transazionale all'inizio del processo di recupero, la fase di rollback viene ignorata. Quando il database è consistente dal punto di vista transazionale, viene riportato in linea dal processo di recupero.
Dopo il ripristino di uno o più backup, nel processo di recupero vengono in genere incluse le fasi di rollforward e rollback. Ogni backup completo e differenziale contiene un numero di record del log delle transazioni sufficiente per consentire il recupero dei dati del backup a uno stato consistente.
[!NOTA]
Durante il ripristino in seguito a un arresto anomalo del sistema o durante un failover del mirroring del database, SQL Server 2005 Enterprise Edition e versioni successive consente agli utenti di accedere al database durante la fase di rollback. Questo processo è noto come recupero rapido. Il recupero rapido è possibile in quanto le transazioni di cui non è stato eseguito il commit quando si è verificato l'arresto anomalo del sistema riacquisiscono tutti gli eventuali blocchi applicati prima di tale arresto. Durante il rollback di tali transazioni, i relativi blocchi le proteggono da interferenze da parte degli utenti.
Relazione tra le opzioni RECOVERY e NORECOVERY e le fasi di ripristino
Una determinata istruzione RESTORE termina dopo la fase di rollforward oppure continua anche nella fase di rollback, in base al fatto che nell'istruzione venga specificata o meno l'opzione WITH NORECOVERY.
WITH RECOVERY include sia la fase di rollforward che la fase di rollback ed esegue il recupero del database. Non è possibile ripristinare ulteriori backup. Si tratta dell'impostazione predefinita.
Se il rollforward del set di rollforward non è stato eseguito fino a un punto sufficiente a garantire la consistenza con il database, non è possibile eseguire la fase di rollback. In Motore di database viene generato un errore e il recupero viene interrotto.
Se l'intero set di rollforward è consistente con il database, viene eseguito il recupero ed è possibile attivare la modalità in linea per il database.
WITH NORECOVERY omette la fase di rollback per conservare le transazioni di cui non è stato eseguito il commit. L'omissione della fase di rollback consente di ripristinare altri backup per eseguire il rollforward del database fino a un momento successivo. RESTORE WITH NORECOVERY esegue talvolta il rollforward dei dati fino al punto in cui sono consistenti con il database. In questi casi, tramite il Motore di database viene generato un messaggio informativo che segnala che è possibile eseguire il recupero del set di rollforward utilizzando l'opzione RECOVERY.
Per informazioni sui set di rollforward, vedere Informazioni sul funzionamento dei processi di ripristino e recupero dei backup in SQL Server.
[!NOTA]
Una terza alternativa, WITH STANDBY, esula dall'ambito di questo argomento.
Per una descrizione approfondita di queste opzioni di RESTORE, vedere RESTORE (Transact-SQL).
Percorsi di recupero
Per percorso di recupero si intende un set univoco di trasformazioni applicate nel tempo al database mantenendone tuttavia la consistenza. Per informazioni sui percorsi di recupero e sui concetti correlati di fork di recupero e rami di recupero, vedere Percorsi di recupero.
Vedere anche