Condividi tramite


Correzione automatica della pagina durante una sessione di mirroring del database

A partire da SQL Server 2008 un partner di mirroring del database tenta di recuperare automaticamente da pagine danneggiate del database mirror risolvendo alcuni tipi di errori che impediscono la lettura di una pagina di dati. Il partner che non è in grado di leggere una pagina ne richiede una copia aggiornata all'altro. Se la richiesta viene soddisfatta, la pagina illeggibile viene sostituita dalla copia. In questo modo, l'errore viene in genere risolto.

Nota

La correzione automatica della pagina dei partner per il mirroring del database è diversa dalla correzione DBCC. La correzione automatica della pagina mantiene tutti i dati. La correzione di errori con l'opzione DBCC_REPAIR_ALLOW_DATA_LOSS potrebbe invece richiedere l'eliminazione di alcune pagine, con conseguente perdita di dati.

Tipi di errore che provocano un tentativo di correzione automatica della pagina

Durante la correzione automatica della pagina mediante mirroring del database, viene eseguito il tentativo di correggere solo le pagine in un file di dati su cui non è stato possibile completare un'operazione, a causa di uno degli errori elencati nella tabella seguente.

Numero di errore

Descrizione

Istanze che provocano un tentativo di correzione automatica della pagina

823

Viene eseguita un'azione solo se il sistema operativo ha eseguito un controllo di ridondanza ciclico (CRC, Cyclic Redundancy Check) che ha generato un errore sui dati.

ERROR_CRC. Il valore del sistema operativo per questo errore è 23.

824

Errori logici.

Errori logici dei dati, come ad esempio un errore di checksum relativo a una pagina danneggiata o di scrittura incompleta.

829

Una pagina contrassegnata come "ripristino in sospeso".

Tutti.

Per visualizzare gli errori CRC 823 e gli errori 824 recenti, vedere la tabella suspect_pages nel database msdb.

Tipi di pagine che non possono essere corretti automaticamente

I seguenti tipi di pagine di controllo non possono essere corretti mediante il mirroring di database:

  • Pagina di intestazione del file (ID pagina 0).

  • Pagina 9 (pagina di avvio del database).

  • 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).

Gestione degli errori di I/O sul database principale

Sul database principale, la correzione automatica della pagina è possibile solo quando il nodo è in stato SYNCHRONIZED e il server principale sta ancora inviando record di log al server mirror. La sequenza di azioni di base in un tentativo di correzione automatica della pagina è la seguente:

  1. Quando si verifica un errore di lettura su una pagina di dati nel database principale, il server principale inserisce una riga nella tabella suspect_pages con lo stato di errore appropriato. Il server principale richiede quindi una copia della pagina al server mirror. La richiesta specifica l'ID della pagina e il numero LSN presente attualmente al termine del log scaricato. La pagina è contrassegnata come ripristino in sospeso. In questo modo non sarà possibile accedervi durante il tentativo di correzione automatica della pagina. Accedendo a questa pagina durante il tentativo di correzione si attiverà l'errore 829 (ripristino in sospeso).

  2. Dopo aver ricevuto la richiesta della pagina, il server mirror attende il completamento del rollforward del log fino al numero LSN specificato nella richiesta. Dopodiché, il server mirror cercherà di accedere alla pagina nel database mirror. Se è possibile accedere alla pagina, il server mirror invierà la copia della pagina al server principale. In caso contrario, il server mirror restituirà un errore al server principale. Il tentativo di correzione automatica della pagina avrà quindi esito negativo.

  3. Il server principale elabora la risposta contenente la copia aggiornata della pagina.

  4. Una volta completata la correzione automatica di una pagina sospetta, la pagina viene contrassegnata nella tabella suspect_pages come ripristinata (event_type = 4).

  5. Se l'errore di I/O della pagina ha causato una qualsiasi transazione posticipata, una volta corretta la pagina il server principale cercherà di risolvere tale transazione.

Gestione degli errori di I/O sul database mirror

Gli errori di I/O sulle pagine di dati che si verificano sul database mirror sono gestiti nel modo seguente.

  1. Se il server mirror rileva errori di I/O in una o più pagine, quando ripete un record di log la sessione di mirroring attiva lo stato SUSPENDED. Dopodiché, tramite il server mirror viene inserita una riga nella tabella suspect_pages con la stato di errore appropriato. Il server mirror richiede quindi una copia della pagina al server principale.

  2. Il server principale cerca di accedere alla pagina nel database principale. Se è possibile accedere alla pagina, il server principale invia la copia della pagina al server mirror.

  3. Se il server mirror riceve una copia di tutte le pagine richieste, cercherà di ripristinare la sessione di mirroring. Se viene completata la correzione automatica di una pagina sospetta, la pagina viene contrassegnata nella tabella suspect_pages come ripristinata (event_type = 5).

    Se un server mirror non riceve una pagina richiesta al server principale, il tentativo di correzione automatica della pagina non andrà a buon fine e la sessione di mirroring rimarrà in sospeso. Se la sessione di mirroring viene ripresa manualmente, le pagine danneggiate verranno rilevate nuovamente durante la fase di sincronizzazione.

Procedura consigliata dagli sviluppatori

La correzione automatica di una pagina è un processo asincrono eseguito in background. Pertanto, anche per i database con mirroring non sarà possibile completare un'operazione sul database che richiede una pagina illeggibile; verrà restituito il codice di errore relativo alla condizione che lo ha causato. In fase di sviluppo di un'applicazione per un database con mirroring, è necessario intercettare le eccezioni per le operazioni con errori. Se il codice di errore SQL Server è 823, 824 o 829, ripetere l'operazione in un secondo momento.