Ripristino di pagine (SQL Server)

Si applica a:SQL Server

Questo argomento illustra come ripristinare le pagine in SQL Server usando SQL Server Management Studio o Transact-SQL. 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 .

Contenuto dell'articolo

Prima di iniziare

Casi in cui è utile il ripristino della pagina

Il ripristino di una pagina è destinato alla 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 offline 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. Se, ad esempio, 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.

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

Limitazioni e restrizioni

  • Il ripristino delle pagine si applica ai 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.

  • È possibile ripristinare solo le pagine di database. Non è possibile usare 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).

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

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

    • Catalogo full-text

  • Nel caso di un database che usa 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 sono offline, poiché i dati offline non vengono registrati nel log. Una pagina offline 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.

Consigli

  • Scenari di ripristino della pagina:

    Ripristino della pagina offline
    Tutte le edizioni di SQL Server supportano il ripristino delle pagine quando il database è offline. Durante un ripristino della pagina offline, il database è offline mentre le pagine danneggiate vengono ripristinate. Al termine della sequenza di ripristino, il database torna online.

    Ripristino della pagina online
    SQL Server Enterprise Edition supporta il ripristino della pagina online, anche se nei casi in cui il database è offline viene usato il ripristino non in linea. Nella maggior parte dei casi, una pagina danneggiata può essere ripristinata mentre il database, incluso il filegroup in cui una pagina viene ripristinata, rimane online. Quando il filegroup primario è online, anche se uno o più filegroup secondari sono offline, il ripristino della pagina viene in genere eseguito online. Talvolta, tuttavia, una pagina danneggiata può richiedere un ripristino offline. Un danno a determinate pagine di importanza critica può ad esempio impedire l'avvio del database.

    Avviso

    Se nelle pagine danneggiate sono archiviati metadati del database di importanza critica, gli aggiornamenti necessari ai metadati potrebbero non riuscire durante un tentativo di ripristino della pagina online. In questo caso è possibile eseguire un ripristino della pagina non in linea, ma è prima necessario creare un backup della parte finale del log eseguendo il backup del log delle transazioni tramite RESTORE WITH NORECOVERY.

  • Il ripristino della pagina sfrutta le funzionalità ottimizzate di segnalazione e rilevamento degli errori a livello di pagina, inclusi i checksum di pagina. Le pagine rilevate come danneggiateda un errore di checksum o di scrittura incompleta possono essere ripristinate tramite un'operazione di ripristino della pagina. Vengono ripristinate solo le pagine specificate in modo esplicito. Ogni pagina specificata viene sostituita dalla copia di tale pagina dal backup dei dati specificato.

    Quando si ripristinano i backup del log successivi, questi vengono applicati solo ai file di database che contengono almeno una pagina recuperata. È 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. Analogamente al ripristino del file, il set di rollforward viene avanzato con un unico passaggio di rollforward del log. Affinché il ripristino delle pagine avvenga correttamente, è necessario che le pagine ripristinate vengano recuperate fino a uno stato consistente con il database.

Sicurezza

Autorizzazioni

Se il database da ripristinare non esiste, per eseguire un'operazione RESTORE l'utente deve disporre delle autorizzazioni CREATE DATABASE. Se il database esiste, le autorizzazioni per l'istruzione RESTORE vengono assegnate per impostazione predefinita ai membri dei ruoli predefiniti del server sysadmin e dbcreator e al proprietario (dbo) del database. Per l'opzione FROM DATABASE_SNAPSHOT, il database esiste sempre.

Le autorizzazioni per l'istruzione RESTORE vengono assegnate ai ruoli in cui le informazioni sull'appartenenza sono sempre disponibili per il server. Poiché è possibile controllare l'appartenenza ai ruoli predefiniti del database solo quando il database è accessibile e non è danneggiato, condizioni che non risultano sempre vere quando si esegue un'operazione RESTORE, i membri del ruolo predefinito del database db_owner non dispongono delle autorizzazioni per l'istruzione RESTORE.

Utilizzo di SQL Server Management Studio

A partire da SQL Server 2016 (13.x), SQL Server Management Studio supporta i ripristini delle pagine.

Per ripristinare le pagine

  1. Stabilire una connessione all'istanza appropriata del motore di database di SQL Server, quindi fare clic sul nome del server in Esplora oggetti per espandere l'albero di server.

  2. Espandere Database. A seconda del database, selezionare un database utente oppure espandere Database di sistemae selezionare un database di sistema.

  3. Fare clic con il pulsante destro del mouse sul database, scegliere Attività, Ripristina, quindi fare clic su Pagina. Verrà aperta la finestra di dialogo Ripristina pagina .

    Recupera
    Questa sezione ha la stessa funzione di Ripristina fino a in Ripristina database (pagina Generale).

    Database
    Consente di specificare il database da ripristinare. È possibile immettere un nuovo database oppure selezionarne uno esistente nell'elenco a discesa. Nell'elenco sono inclusi tutti i database disponibili nel server, ad eccezione dei database di sistema master e tempdb.

    Avviso

    Per ripristinare un backup protetto da password, è necessario usare l'istruzione RESTORE .

    Backup della parte finale del log
    Immettere o selezionare un nome di file in Dispositivo di backup per indicare dove verrà archiviato il backup della parte finale del log per il database.

    Set di backup
    In questa sezione vengono visualizzati i set di backup coinvolti nel ripristino.

    Intestazione Valori
    Nome Nome del set di backup.
    Componente Componente incluso nel backup, ovvero Database, File o <vuoto> (nel caso dei log delle transazioni).
    Type Tipo di backup eseguito: Completo, Differenzialeo Log delle transazioni.
    Server Nome dell'istanza del motore di database che ha eseguito l'operazione di backup.
    Database Nome del database interessato dall'operazione di backup.
    Posizione Posizione del set di backup nel volume.
    Primo LSN Numero di sequenza del file di log (LSN) della prima transazione nel set di backup. Vuoto per i backup dei file.
    Ultimo LSN Numero di sequenza del file di log (LSN) dell'ultima transazione nel set di backup. Vuoto per i backup dei file.
    LSN checkpoint Numero di sequenza del file di log (LSN) del checkpoint più recente al momento della creazione del backup.
    LSN completo Numero di sequenza del file di log (LSN) dell'operazione di backup completo del database più recente.
    Data di inizio Data e ora di inizio dell'operazione di backup, visualizzate in base alle impostazioni internazionali del client.
    Data fine Data e ora di fine dell'operazione di backup, visualizzate in base alle impostazioni internazionali del client.
    Dimensione Dimensioni in byte del set di backup.
    Nome utente Nome dell'utente che ha eseguito l'operazione di backup.
    Scadenza Data e ora di scadenza del set di backup.

    Fare clic su Verifica per controllare l'integrità dei file di backup necessaria per eseguire l'operazione di ripristino della pagina.

  4. Per identificare pagine danneggiate, con il database corretto selezionato nella casella Database , fare clic su Controlla pagine di database. questa è un'operazione a esecuzione prolungata,

    Avviso

    Per ripristinare pagine specifiche non danneggiate, fare clic su Aggiungi e immettere l' ID file e l' ID pagina delle pagine da ripristinare.

  5. La griglia di pagine viene usata per identificare le pagine da ripristinare. All'inizio questa griglia viene popolata dalla tabella di sistema suspect_pages . Per aggiungere o rimuovere pagine dalla griglia, fare clic su Aggiungi o su Rimuovi. Per altre informazioni, vedere Gestione della tabella suspect_pages (SQL Server).

  6. Nella griglia Set di backup sono elencati i set di backup inclusi nel piano di ripristino predefinito. Facoltativamente, fare clic su Verifica per verificare che i backup siano leggibili e che i set di backup siano completi, senza ripristinarli. Per altre informazioni, vedere RESTORE VERIFYONLY (Transact-SQL).

    Pagine

  7. Per ripristinare le pagine elencate nella griglia, fare clic su OK.

Utilizzo di Transact-SQL

Per specificare una pagina in un'istruzione RESTORE DATABASE, sono necessari 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 <backup_device> [ ,... n ]
  
 WITH NORECOVERY

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

Per ripristinare le pagine

  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, usare una delle origini seguenti:

    Origine dell'ID di pagina Argomento
    msdb..suspect_pages Gestire la tabella suspect_pages (SQL Server)
    Log degli errori Visualizzare il log degli errori di SQL Server (SQL Server Management Studio)
    Tracce degli eventi Monitoraggio e risposta agli eventi
    DBCC DBCC (Transact-SQL)
    Provider WMI Concetti relativi al provider WMI per eventi del server
  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 usare la clausola PAGE per elencare gli ID di tutte le pagine da ripristinare.

  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 offline l'ultima pagina ripristinata. L'LSN finale, impostato come parte del primo ripristino nella sequenza, è l'LSN di destinazione di rollforward. Il rollforward online del file che include la pagina è in grado di arrestarsi in corrispondenza dell'LSN di destinazione di rollforward. Per conoscere l'LSN di destinazione della fase di rollforward corrente di un file, vedere la colonna redo_target_lsn di sys.master_files. Per altre informazioni, vedere sys.master_files (Transact-SQL).

  6. Ripristinare il nuovo backup del log. Una volta applicato il nuovo backup del log, 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 (Transact-SQL)

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. Nell'esempio seguente viene eseguito un ripristino in linea. Nell'esempio l'ID del file B è 1e gli ID delle pagine danneggiate sono 57, 202, 916e 1016.

RESTORE DATABASE [<database>] PAGE='1:57, 1:202, 1:916, 1:1016'  
   FROM DISK = '<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

Vedi anche

RESTORE (Transact-SQL)
Applicare backup di log delle transazioni (SQL Server)
Gestire la tabella suspect_pages (SQL Server)
Backup e ripristino di database SQL Server