La differenza chiave tra backup completi e di sola copia è indipendentemente dal fatto che sia LSN (Log Sequence Number) e in particolare l' DatabaseBackupLSN
aggiornamento.
Quando si esegue un backup completo, DatabaseBackupLSN
viene aggiornato. Dopo aver eseguito il backup completo, se si esegue un backup differenziale quel backup ha un valore DatabaseBackupLSN
corrispondente a quello del backup completo e quindi SQL può collegare i due insieme (ad esempio, sa da quei LSN che il diff ha seguito il pieno).
Il problema si presenta quando si eseguono backup pianificati, quindi si dispone di un backup completo iniziale e quindi di una sequenza di differenziali. Se si esegue manualmente un backup completo, verrà aggiornato l'LSN, quindi da quel momento in poi ogni backup differenziale eseguito tramite backup pianificato farà riferimento a un nuovo LSN non a quello originale. In caso di necessità di ripristino, è possibile ripristinare il backup completo pianificato, ma quando si tenta di ripristinare uno qualsiasi dei backup differenziali eseguiti dopo il processo manuale, si riscontrerebbe un errore poiché gli LSN non corrispondono più.
Con un backup di sola copia non tocca DatabaseBackupLSN
, e come tale non interrompe quella catena di backup.
C'è una buona descrizione del problema, oltre al motivo per cui così tante persone lo fraintendono in Breaking the Backup Chain - REDUX (Or Eating Crow) di Michael K. Campbell, che include buone guide visive come questa:
Per una buona spiegazione dei quattro diversi LSN e di come vengono utilizzati, vedere Informazioni sui numeri di sequenza dei log di SQL Server per i backup di Simon Liew.
Il modo per evitare il problema è di non avere più di una cosa che fa backup standard di un database. Qualsiasi backup ad hoc o secondario deve essere eseguito con l'opzione di sola copia, vedere Backup di sola copia (SQL Server) per tutti i dettagli, ma essenzialmente si utilizza l'opzione "Copia solo di backup" in SSMS, tramite T-SQL specificare WITH COPY_ONLY
nel comando o con PowerShell utilizzare il -CopyOnly
parametro