Esecuzione di ripristini di pagine

 Le informazioni contenute in questo argomento sono rilevanti per i database di SQL Server che utilizzano i modelli di recupero con registrazione completa o con registrazione minima delle operazioni bulk. Il ripristino della pagina è supportato solo per i filegroup di lettura/scrittura.

L'obiettivo di un ripristino della pagina è ripristinare una o più pagine danneggiate senza ripristinare l'intero database. In genere, le pagine candidate al ripristino sono state contrassegnate come "sospette" a causa di un errore verificatosi all'accesso alla pagina. Le pagine sospette vengono identificate nella tabella suspect_pages del database msdb.

Nota

Non tutti gli errori di pagina richiedono un ripristino. Nei dati della cache, ad esempio in un indice secondario, può verificarsi un problema risolvibile ricalcolando i dati. Ad esempio, se l'amministratore del database elimina un indice secondario e lo ricrea, i dati danneggiati, sebbene corretti, non sono indicati come tali nella tabella suspect_pages.

È possibile ripristinare immediatamente più pagine di database. I backup del file di log vengono applicati a tutti i file di database contenenti una pagina in fase di recupero. Analogamente al ripristino del file, il set di rollforward viene avanzato con un unico passaggio di rollforward del log.

Il ripristino delle pagine è progettato per la correzione di pagine danneggiate isolate. Il ripristino e il recupero di poche pagine singole possono essere eseguiti in modo più rapido rispetto al ripristino di un file, riducendo la quantità di dati non in linea durante l'operazione di ripristino. Tuttavia, se è necessario ripristinare un certo numero di pagine in un file, in genere è più efficiente ripristinare l'intero file. Ad esempio, se numerose pagine in un dispositivo indicano la possibilità di un guasto imminente del dispositivo, prendere in considerazione il ripristino del file, se possibile in un percorso diverso, e la riparazione del dispositivo.

Scenari di ripristino della pagina

Tutte le edizioni di SQL Server 2005 e versioni successive supportano il ripristino della pagina quando il database non è in linea (ripristino della pagina non in linea). In SQL Server 2005 Enterprise Edition e versioni successive se il database è in linea durante un ripristino della pagina, esso rimane in linea. Il ripristino e il recupero di una pagina mentre il database è in linea è detto ripristino della pagina in linea.

Gli scenari di ripristino della pagina sono i seguenti:

  • Ripristino della pagina non linea

    SQL Server 2005 Standard, SQL Server 2005 Express Edition e SQL Server 2005 Workgroup e versioni successive supportano solo il ripristino non in linea. SQL Server 2005 Enterprise Edition e versioni successive utilizzano il ripristino non in linea se il database è già non in linea. Durante un ripristino non in linea delle pagine danneggiate, il database non è in linea. Al termine della sequenza di ripristino, il database torna in linea.

    È necessario che le pagine ripristinate vengano recuperate fino a uno stato consistente con il database perché il ripristino delle pagine avvenga correttamente. È inoltre necessario che una catena non interrotta di backup del log venga applicata all'ultimo ripristino completo o differenziale per aggiornare il filegroup che include la pagina rispetto al file di log attuale.

  • Ripristino della pagina in linea

    In SQL Server 2005 Enterprise Edition e versioni successive, quando le condizioni lo consentono, il ripristino della pagina viene eseguito automaticamente in linea. Nella maggior parte dei casi, una pagina danneggiata può essere ripristinata mentre il database, incluso il filegroup rispetto al quale una pagina viene ripristinata, rimane in linea. Il ripristino della pagina in linea è particolarmente utile per le pagine danneggiate da errori hardware.

    Occasionalmente, una pagina danneggiata può richiedere un ripristino non in linea. Ad esempio, il danno a determinate pagine di importanza critica può impedire l'avvio del database. In questi casi è necessario utilizzare il ripristino non in linea.

    Nota

    Un ripristino in linea tenta di aggiornare i metadati. Tale aggiornamento può non riuscire se è coinvolta una pagina di importanza critica. Se un tentativo di ripristino in linea ha esito negativo, il ripristino dovrà essere eseguito non in linea.

Il ripristino della pagina sfrutta le funzionalità ottimizzate di segnalazione e rilevamento degli errori a livello di pagina, inclusi i checksum di pagina, disponibili in SQL Server 2005 e versioni successive. Le pagine rilevate come danneggiate da un errore di checksum o di scrittura incompleta possono essere ripristinate specificandole in un'istruzione RESTORE. Il ripristino della pagina è progettato per il ripristino di un numero limitato di pagine danneggiate. Ogni pagina specificata in un'istruzione RESTORE viene sostituita da una pagina dal set di backup specificato. È necessario che le pagine ripristinate vengano recuperate fino a uno stato consistente con il database. Vengono ripristinate solo le pagine specificate in modo esplicito.

Limitazioni del ripristino della pagina

È possibile ripristinare solo le pagine di database. Non è possibile utilizzare il ripristino della pagina per gli elementi seguenti:

  • Log delle transazioni

  • Pagine di allocazione: pagine mappa di allocazione globale (GAM, Global Allocation Map), pagine mappa di allocazione globale condivisa (SGAM, Shared Global Allocation Map) e pagine spazio libero nella pagina (PFS, Page Free Space). Per ulteriori informazioni, vedere Gestione delle allocazioni di extent e dello spazio libero.

  • Pagina 0 di tutti i file di dati (pagina di avvio del file)

  • Pagina 1:9 (pagina di avvio del database)

  • Catalogo full-text

Se non è possibile ripristinare una singola pagina, è necessario utilizzare il backup completo del database o il backup completo del file o del filegroup esistente.

Nota

Se la pagina da ripristinare rappresenta un caso particolare, com'è il caso delle pagine di metadati, il ripristino della pagina in linea non riuscirà. In tali casi, tentare di eseguire un ripristino della pagina non in linea.

Requisiti per il ripristino delle pagine

Per il ripristino della pagina è necessario che siano soddisfatti i requisiti seguenti:

  • I database devono utilizzare il modello di recupero con registrazione completa o il modello di recupero con registrazione minima delle operazioni bulk. Potrebbero verificarsi alcuni problemi se si utilizza il modello con registrazione minima delle operazioni bulk. Per ulteriori informazioni, vedere la sezione seguente.

  • Non è possibile ripristinare pagine appartenenti a filegroup di sola lettura. Se nel filegroup è in corso un ripristino della pagina, non sarà possibile convertire il filegroup in un filegroup di sola lettura.

  • La sequenza di ripristino deve iniziare con un backup completo, di file o di filegroup.

  • Il ripristino della pagina richiede una catena non interrotta di backup del log fino al file di log attuale ed è necessario che vengano applicati tutti i backup, in modo da aggiornare la pagina al file di log attuale.

  • Analogamente a una sequenza di ripristino di file, è possibile aggiungere altre pagine al set di rollforward a ogni passaggio di ripristino.

  • Non è possibile eseguire contemporaneamente un backup del database e un ripristino della pagina.

Modello di recupero con registrazione minima delle operazioni bulk e ripristino della pagina

Nel caso di un database che utilizza il modello di recupero con registrazione minima delle operazioni bulk, per il ripristino della pagina sono previste le condizioni aggiuntive seguenti:

  • Il backup dei dati con registrazione minima delle operazioni bulk risulta problematico se il filegroup o i dati della pagina non sono in linea, poiché i dati non in linea non vengono registrati nel log. Una pagina non in linea può impedire il backup del log. In questo caso, prendere in considerazione l'utilizzo di DBCC REPAIR, che può consentire una minore perdita di dati rispetto al ripristino del backup più recente.

  • Se un backup del log di un database con registrazione minima delle operazioni bulk rileva una pagina contenente errori, non sarà possibile completarlo, a meno che non sia specificata la clausola WITH CONTINUE_AFTER_ERROR.

  • Il ripristino della pagina in genere non funziona con il recupero con registrazione minima delle operazioni bulk.

    Una procedura consigliata per l'esecuzione del ripristino della pagina consiste nell'impostare il database sul modello di recupero con registrazione completa e tentare un backup del log. Se il backup del log funziona, è possibile procedere con il ripristino della pagina. Se l'esecuzione del backup del log ha invece esito negativo, le modifiche eseguite dopo il backup del log precedente verranno perse oppure sarà necessario tentare di eseguire DBCC con l'opzione REPAIR_ALLOW_DATA_LOSS.

Sintassi di base per il ripristino della pagina

Per specificare una pagina in un'istruzione RESTORE DATABASE, è necessario l'ID del file contenente la pagina e l'ID della pagina. La sintassi necessaria è la seguente:

RESTORE DATABASE database_name

   PAGE ='file:page [ ,...n ]' [ ,...n ]

   FROM <dispositivo_backup> [ ,...n ]

WITH NORECOVERY

Per ulteriori informazioni sui parametri dell'opzione PAGE, vedere Argomenti dell'istruzione RESTORE (Transact-SQL). Per ulteriori informazioni sulla sintassi di RESTORE DATABASE, vedere RESTORE (Transact-SQL).

Procedura per il ripristino della pagina

Di seguito sono riportati i passaggi principali di un ripristino della pagina.

  1. Ottenere gli ID di pagina delle pagine danneggiate da ripristinare. Un errore di checksum o di scrittura incompleta restituisce l'ID della pagina, con le informazioni necessarie per specificare le pagine. Per cercare l'ID di una pagina danneggiata, utilizzare una delle origini seguenti:

  2. Avviare un ripristino della pagina con un backup completo del database, del file o del filegroup contenente la pagina desiderata. Nell'istruzione RESTORE DATABASE utilizzare la clausola PAGE per elencare gli ID di tutte le pagine da ripristinare.

    PAGE ='file:page [ ,...n ]' [ ,...n ]'

  3. Applicare i backup differenziali più recenti.

  4. Applicare i backup del log successivi.

  5. Creare un nuovo backup del log del database che include l'LSN finale delle pagine ripristinate, ovvero il punto in corrispondenza del quale viene portata fuori linea l'ultima pagina ripristinata. L'LSN finale, impostato come parte del primo ripristino nella sequenza, è l'LSN di destinazione di rollforward. Il rollforward in linea del file che include la pagina è in grado di interrompersi in corrispondenza dell'LSN di destinazione di rollforward. Per conoscere l'LSN di destinazione di rollforward corrente di un file, vedere la colonna redo_target_lsn di sys.master_files. Per ulteriori informazioni, vedere sys.master_files (Transact-SQL).

  6. Ripristinare il nuovo backup del log. Una volta applicato il nuovo backup, il ripristino della pagina è completo e le pagine sono utilizzabili.

Nota

Questa sequenza è analoga a una sequenza di ripristino del file. In effetti, il ripristino della pagina e i ripristini dei file possono essere eseguiti entrambi come parte della stessa sequenza.

Esempio

Nell'esempio seguente vengono ripristinate quattro pagine danneggiate del file B con NORECOVERY. Successivamente, vengono applicati due backup del log con NORECOVERY, seguiti dal backup della parte finale del log, ripristinato con RECOVERY.

Nota importanteImportante

Se nelle pagine danneggiate sono archiviati metadati del database di importanza critica, potrebbe essere necessaria una sequenza di ripristino della pagina fuori linea. Per eseguire un ripristino non in linea è necessario eseguire il backup del log delle transazioni specificando WITH NORECOVERY.

Nell'esempio seguente viene eseguito un ripristino in linea. Nell'esempio seguente, l'ID del file B è 1 e gli ID delle pagine danneggiate sono 57, 202, 916 e 1016.

RESTORE DATABASE <database> PAGE='1:57, 1:202, 1:916, 1:1016'
   FROM <file_backup_of_file_B> 
   WITH NORECOVERY;
RESTORE LOG <database> FROM <log_backup> 
   WITH NORECOVERY;
RESTORE LOG <database> FROM <log_backup> 
   WITH NORECOVERY; 
BACKUP LOG <database> TO <new_log_backup> 
RESTORE LOG <database> FROM <new_log_backup> WITH RECOVERY;
GO