Il ripristino di un database SQL dal backup ricostruisce i suoi indici?


10

Il ripristino di un database SQL dal backup ricostruisce le sue tabelle e gli indici da zero? O lo mantiene nello stesso ordine fisico interno in cui si trovava al momento del backup?

Stiamo usando SQL 2000 con il backup compresso di Quest Lightspeed, se questo fa la differenza.

Risposte:


16

La risposta è no, per qualunque software di backup venga utilizzato.

Un backup è un'operazione fisica, non un'operazione logica. Legge tutte le estensioni contenenti pagine allocate (ovvero anche se è allocata una sola pagina da un'estensione di 8 pagine, eseguirà il backup dell'intera estensione 64 KB) e lo fa in ordine fisico.

Un ripristino è un'operazione fisica, non un'operazione logica. Stabilisce le estensioni nelle loro posizioni legittime nei file di dati.

Ricostruire un indice (o qualcosa del genere) è un'operazione logica, che deve essere registrata. Il backup e il ripristino manipolano direttamente i file di dati, senza passare attraverso il pool di buffer, motivo per cui non è possibile farlo. Un altro motivo per cui non è possibile farlo è che il backup e il ripristino non hanno alcuna comprensione di ciò che è contenuto nei dati sottoposti a backup.

Il motivo principale per cui non è possibile farlo, tuttavia, è che lo spostamento delle pagine durante un'operazione di ripristino interromperebbe i puntatori b-tree. Se la pagina A punta alla pagina B, ma la pagina A viene spostata dal processo di ripristino, come viene aggiornata la pagina B per puntare alla pagina A? Se viene aggiornato immediatamente, potrebbe essere sovrascritto dal resto del processo di ripristino. Se viene rinviato aggiornato, cosa succede se il processo di ripristino ripristina un registro delle transazioni che rimuove la pagina A o la pagina B? Semplicemente non può essere fatto.

In conclusione: backup e ripristino sono operazioni fisiche che non modificano mai i dati.

Spero che sia di aiuto!

PS Sebbene non affronti direttamente questa domanda, consulta l'articolo che ho scritto per la rivista TechNet di luglio che spiega come funzionano internamente i vari backup: Comprensione dei backup di SQL Server . La rivista di settembre avrà il prossimo della serie sulla comprensione dei restauri.


2
Adoro il fatto che tu abbia spiegato che l'indicizzazione è un'operazione logica.
Jim B,

Ah, ha senso. Il backup acquisisce 64k estensioni fisiche complete, non 8k pagine di dati.
BradC,

Questo non ha senso. Le operazioni di backup spesso comprimono i dati di cui eseguono il backup, e questo è il tipo di "modifica" di cui stiamo parlando: dopo tutto, gli indici possono essere ricreati dalle tabelle, sono dati ridondanti (a condizione che venga eseguito il backup dello schema , ovviamente). Il vero motivo è la pigrizia da parte degli sviluppatori del database.
Giovanni

1
@John Che cosa stai dicendo è una sciocchezza? La compressione non è menzionata da nessuna parte qui - sta solo ricostruendo gli indici, che non è in alcun modo uguale alla compressione (che non cambia le pagine o la loro posizione nel database durante un ripristino, mentre una ricostruzione lo fa). Ricreare gli indici da zero durante un ripristino sarebbe incredibilmente lento rispetto al semplice ripristino così com'è dal backup. Penso che tu abbia frainteso qualcosa qui.
Paul Randal,

Il rilascio e la ricostruzione di indici è un tipo di compressione e la compressione potrebbe cambiare qualsiasi cosa, a seconda del tipo di compressione. La compressione con perdita nell'elaborazione delle immagini è ancora chiamata compressione. Qualsiasi meccanismo che rappresenta le informazioni fornite in uno spazio più piccolo è una forma di compressione, e la caduta di indici ne è un banale esempio. Il lento tempo di ricostruzione può davvero essere un vero argomento, almeno contro l'implementazione che è uno sforzo utile.
Giovanni

6

Un backup SQL nativo è solo un dump pagina per pagina dei file di backup, quindi la risposta è "no". Un backup Quest della velocità della luce probabilmente utilizza una sorta di algoritmo di compressione della compressione, ma non "ricostruirà" i file di dati o gli indici, il che richiederebbe una quantità orribile di tempo in un database di grandi dimensioni.


Sì, ma deve comunque scrivere ogni pagina sul disco. Perché non scriverli in sequenza logica, anziché in un ordine frammentato? (Forse si tratta più di una domanda di backup che di una domanda di ripristino : il backup scrive le pagine in ordine fisico o in ordine logico?)
BradC,

supponendo che esistesse un prodotto che scrisse i dati in ordine di indice, in quale ordine desideri salvare la tabella? Diciamo che ho una tabella con 3 colonne product_id, productname e price. Qual è la colonna corretta su cui ordinare per salvare le pagine nell'ordine indicizzato? A proposito, non c'è nulla che ti impedisca di indicizzare sull'intera tabella (un indice cluster) o su ciascuna delle righe (indice composito).
Jim B,

@Jim B: è facile. Le tabelle verrebbero salvate in ordine di indice cluster. Gli indici non cluster verranno archiviati nell'ordine delle chiavi. I cumuli sarebbero mantenuti nell'ordine originale (non ordinato). (Aaron e Paul hanno menzionato validi motivi per cui il backup / ripristino non lo fa. Non riuscire a capire "l'ordine preferito" non è uno di questi motivi. Altrimenti fare una ricostruzione completa dell'indice avrebbe lo stesso problema. )
BradC,

Il backup dei dati viene eseguito esattamente nello stesso ordine di pagina fisico in cui vengono salvati all'interno dei file del database. Quando i dati vengono ripristinati, vengono ripristinati nello stesso ordine di pagina in cui è stato eseguito il backup. SQL non sposta i dati in giro per vari motivi. Compreso che potrebbero esserci problemi con le transazioni che ripristinano i registri e i problemi di concatenamento delle pagine, per non parlare delle enormi quantità di tempo extra necessarie per mescolare i dati su database multi-TB.
mrdenny,

2

Il backup viene eseguito regolarmente e molto spesso (spero). Quindi i progettisti si sono assicurati che il backup fosse il più rapido possibile. Qual è l'I / O più veloce? Sequenziale. Leggi i blocchi dai dischi nell'ordine fisico esatto, hai le migliori prestazioni.

Perché mai il database dovrebbe eseguire ingombranti operazioni di I / O casuali ogni singola notte , distruggendo le teste dei dischi dappertutto? La differenza sarebbe intorno a due ordini di grandezza. Non vi è alcun guadagno possibile in questo.


Sono d'accordo con il tuo punto generale, ma a seconda della configurazione di archiviazione sottostante, l'I / O casuale potrebbe non essere ordini di grandezza peggiori dell'I / O sequenziale (un'unità SAN che si sviluppa su dozzine di mandrini, ad esempio). Infatti, se il file di dati è frammentato sul disco rigido, anche l'I / O "sequenziale" non è affatto sequenziale. Ma i punti di Paul prevalgono su questo (il problema con l'aggiornamento dei puntatori e che la deframmentazione dovrebbe essere un'operazione registrata)
BradC

0

Hmmm. BradC, hai già lavorato con Firebird / Interbase - dove l'utilità / API di backup / ripristino principale è più simile al "Copia database ..." di SSMS / EM? In tal caso, sapere che MS SQL Server NON è simile.

Un backup di SQL Server è più un dump del database che viene ripristinato "COSÌ COM'È", quindi è più come un comodo collegamento online per un'operazione "staccare-copiare-ricollegare su altro luogo". Il database ripristinato è quasi una copia esatta del file di database originale (quasi perché è possibile modificare il posizionamento dei file di database di un database ripristinato) ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.