I database possono essere danneggiati in qualsiasi momento e questo è un problema preoccupante per gli amministratori di database, poiché mette a rischio tutti i dati cruciali presenti sul server SQL. Inoltre, i dati diventano inaccessibili, con un impatto sul flusso di lavoro dell’organizzazione. Per questo motivo, è importante risolvere immediatamente il problema della corruzione. Tuttavia, è altrettanto importante capire le cause della corruzione, altrimenti si ripresenterà. Questo blog fornisce informazioni essenziali su come risolvere il danneggiamento delle pagine in SQL server.
Cause di corruzione a livello di pagina di SQL Server
Ecco alcuni dei principali motivi che possono portare al danneggiamento del database di SQL Server.
- Bug del software all’interno del programma SQL Server: In questo caso, i dati vengono scritti male sul disco. Guardate questi documenti Microsoft:
È possibile evitare questo tipo di problema installando l’ultimo aggiornamento cumulativo (CU) della versione di SQL Server.
- Problemi di memoria: Si tratta di problemi hardware che possono interessare l’intero sistema e non solo MS SQL Server. Esistono programmi per verificare la correttezza dei dati in memoria.
- Problemi del sottosistema I/O: In questo caso, non è facile capire la causa del problema perché il sistema di archiviazione può avere un’architettura complicata. Ad esempio, prima di scrivere sul disco fisico, è possibile che si debba attraversare una rete o che ci sia un controller del disco e i suoi driver. Uno qualsiasi di questi componenti può guastarsi.
- Arresto improvviso del server: Esiste un rischio sostanziale di corruzione del database, se per qualsiasi motivo il server si spegne improvvisamente. Ciò può accadere a causa di un guasto fisico del server o per mancanza di elettricità.
Come rilevare la corruzione a livello di pagina in SQL Server?
I database di MS SQL Server sono costituiti da pagine di dati di 8 KB. Otto pagine fisicamente contigue costituiscono un’estensione di 64 KB. La corruzione della pagina significa che una o più pagine contengono valori errati.
Se il database è danneggiato, è possibile verificarlo in tre modi:
1. L’esecuzione dell’istruzione SELECT sulla tabella danneggiata mostra un errore
In questo caso, viene visualizzato il messaggio di errore:
- Il tipo di errore (in questo caso si tratta di un errore di I/O basato sulla coerenza logica, causato da una somma di controllo errata).
- La pagina in cui si trova l’errore (pagina 1:368).
- L’offset in cui si trova l’errore (0x00000002e0000).
- L’ID del database danneggiato (ID=31).
2. Eseguire l’istruzione DBCC CHECKDB
Questo comando controlla l’integrità fisica e logica degli oggetti del database, le relazioni degli indici e altri controlli strutturali. Basta digitare DBCC CHECK con il nome del database tra parentesi tonde.
In questo caso, l’errore viene visualizzato:
- Il numero di pagine danneggiate (pagina 1:368).
- Il nome della tabella (persona) corrotta.
3. Eseguire una SELECT sulla tabella [msdb].[dbo].[suspect_pages].
Il comando SELECT restituirà una griglia con una riga per ogni pagina danneggiata. In questo caso, possiamo vedere che nel database con ID = 31 la pagina 1:368 è danneggiata.
Come risolvere la corruzione a livello di pagina in SQL Server?
Qui abbiamo menzionato due modi diversi per riparare e recuperare il database.
1. Recupero manuale tramite comandi T-SQL
Nota: prima di procedere, eseguire un backup dei database e/o una copia dei file fisici. Il processo manuale è rischioso.
Per procedere al ripristino manuale tramite comandi T-SQL per risolvere il danneggiamento della pagina in SQL server, seguite le istruzioni riportate di seguito.
Utilizzate il comando non documentato DBCC IND per verificare che la pagina 368 sia una pagina di dati.
DBCC IND('Recovery_test',Person,-1)
Questo comando mostra tutte le pagine relative alla tabella, indicata nel secondo parametro, con le informazioni relative al tipo di pagina. Nell’esempio seguente,
- La prima riga ha il tipo di pagina 10. Si tratta quindi della pagina IAM (Index Allocation Map).
- La seconda riga ha il tipo di pagina 1. Indica che la pagina 368 contiene dati.
Per visualizzare i dati contenuti nella pagina 1:368, possiamo aprire recovery_test.mdf con un editor esadecimale e passare all’offset 2e0000.
Il carattere rosso ‘b’ (vedi immagine sotto) sembra sospetto in quanto il mio nome è “Luca” e non “Lucb”.
2. Utilizzare il comando DBCC PAGE:
Per ottenere il risultato del comando DBCC PAGE, è necessario impostare il flag di tracciamento 3604.
DBCC TRACEON (3604)
DBCC PAGE('Recovery_test',1,368,2) CON I RISULTATI DELLE TABELLE
I parametri richiesti sono:
- Nome del database
- Numero del file
- Numero della pagina
- STAMPA
I valori del parametro printopt sono:
- 0 – Stampa la parte di intestazione della pagina.
- 1 – Intestazione della pagina SQL con i dump esadecimali per riga.
- 2 – Dettagli dell’intestazione della pagina con l’intero dump esadecimale della pagina.
- 3 – Intestazione della pagina con descrizione dell’interpretazione per riga.
I dati riportati sono gli stessi.
È necessario modificare il valore del carattere dal valore Hex 62 (b) al valore Hex 61 (a).
Possiamo utilizzare un altro comando non documentato, il comando DBCC WRITEPAGE. Si tratta di un comando potente che consente di scrivere direttamente su una pagina.
Per utilizzare il comando DBCC WRITEPAGE, sono necessarie le seguenti informazioni:
- Il primo parametro è il nome del database.
- Il secondo e il terzo sono il fileId e il PageId che devo modificare (1: 368).
- Il quarto parametro è l’offset (es.74 -> 116 dec.) e il quinto è il numero di caratteri da scrivere (1).
- Il sesto parametro è il valore che devo scrivere. Nel nostro caso, è 0x000000.
- Il settimo parametro specifica se scrivere il valore attraverso il pool di buffer. Impostiamo il valore 1 per scrivere direttamente sul file fisico mdf.
Per prima cosa, mettete il database in modalità SINGLE_USER:
ALTER DATABASE recovery_test SET SINGLE_USER CON ROLLBACK IMMEDIATO
Eseguire quindi il comando WRITEPAGE:
DBCC WRITEPAGE ('recovery_test', 1, 368, 116, 1, 0x61,1)
Eseguire nuovamente l’operazione per verificare se i dati sono cambiati:
DBCC TRACEON (3604)
DBCC PAGE('Recovery_test',1,368,2) CON I RISULTATI DELLE TABELLE
Sì, i dati sono cambiati.
Impostare il database in modalità MULTI_USER:
ALTER DATABASE recovery_test SET MULTI_USER CON ROLLBACK IMMEDIATO
Controllare lo stato di salute del database:
DBCC CHECKDB ('recovery_test')
Dal registro, si può notare che non ci sono errori. Ciò significa che il database non è più corrotto.
Riparare il database utilizzando Stellar Repair for MS SQL
Consideriamo che il problema che abbiamo risolto manualmente è un caso estremamente semplice. Ma la riparazione di casi di corruzione complessi richiede conoscenze avanzate e comporta il rischio di danneggiare maggiormente i dati. Tuttavia, un’applicazione dedicata come Stellar Repair for MS SQL può risolvere lo stesso problema in modo sicuro e veloce. Per recuperare un database corrotto sono necessari solo alcuni semplici passaggi. Questi sono:
- Avviare l’applicazione Stellar Repair for MS SQL.
- All’avvio, l’applicazione chiede di selezionare il database da recuperare. Indicare un file con estensione .mdf.
- È quindi possibile scegliere di recuperare anche i record eliminati.
- Premere il pulsante Ripara.
- Esistono due modalità di recupero: Standard e Avanzata.
La struttura del database viene analizzata per la riparazione. Una barra di avanzamento mostra il progresso del lavoro.
- Il risultato di questa fase di scansione viene salvato. È quindi possibile riutilizzarlo. Dall’interfaccia grafica si possono vedere tutti gli oggetti del database.
- L’ultimo passo consiste nel salvare i dati recuperati. Possiamo salvare i dati in un nuovo database, in un database esistente o in un altro formato (CSV, XLS o HTML).
- Quando si seleziona l’opzione Nuovo database, viene richiesto il nome del database da creare. I dati verranno copiati nel database generato.
Per concludere
Il database SQL si corrompe per una serie di motivi. In questo post abbiamo discusso le cause del danneggiamento a livello di pagina in SQL Server. Abbiamo anche visto come rilevare la corruzione del database e come riparare il database danneggiato manualmente tramite comandi T-SQL e utilizzando un software di riparazione SQL. Il software può fare un lavoro encomiabile per risolvere il problema e riportare il database a uno stato di funzionamento perfetto.
Was this article helpful?