Condividi tramite


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 bulk minima. 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 di testo integrale

  • Nel caso di un database che usa il modello di recupero con registrazione minima bulk, per il ripristino della pagina sono previste le condizioni aggiuntive seguenti.

    • Effettuare il backup quando un filegroup o i dati di pagina sono offline è problematico per i dati con registrazione minima delle operazioni bulk, perché 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 a registrazione minima rileva una pagina errata, fallirà a meno che non sia specificato WITH CONTINUE_AFTER_ERROR.

    • Il ripristino della pagina in genere non funziona con il recupero con registrazione bulk a valori minimi.

      Una procedura consigliata per l'esecuzione del ripristino della pagina consiste nell'impostare il database sul modello di recupero completo 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, tuttavia, nel caso in cui il database sia offline, viene usato il ripristino offline. 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 danneggiate da 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. È necessario applicare una catena non interrotta di backup del log all'ultimo ripristino completo o differenziale per portare avanti il filegroup che contiene la pagina fino al file di log corrente. Analogamente al ripristino del file, il set di avanzamento viene avanzato con un unico passaggio di ripetizione 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 RESTORE vengono assegnate ai ruoli in cui le informazioni sull'appartenenza sono sempre disponibili sul 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. Espandi 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 del Tail-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).
    Tipo 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. Spazio riservato per i backup dei file.
    Ultimo LSN Numero di sequenza del file di log (LSN) dell'ultima transazione nel set di backup. Spazio vuoto per i backup dei file.
    Checkpoint LSN Numero di sequenza di log (LSN) del checkpoint più recente quando il backup è stato creato.
    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 di lunga durata.

    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, fornendo 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 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 obiettivo per il rollforward. Il roll forward online del file che include la pagina è in grado di arrestarsi in corrispondenza dell'LSN di destinazione del redo. Per conoscere l'LSN di destinazione 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