La megaditta รจ ferma! ..DBCC CHECK fallito

Rieccoci!

Prima di tutto, grazie delle tante visite, noi nonostante il caldo siamo ancora qui anche per farvi compagnia in questo assolato agosto.
Avviso di servizio: tra una settimana ci prenderemo una breve pausa, se volete potrebbe essere l'occasione ideale per rileggere ciรฒ che vi รจ scappato!

L'articolo di oggi rappresenta il proseguo di quello di ieri ( Di database corrotti ed aziende bloccate), una sorta di parte 2.
L'argomento รจ vasto e cosรฌ questa volta vedremo come controllare se un database รจ corrotto o meno.
Vedremo che a volte sarร  possibile individuare quali sono la tabelle rovinate e che non sono piรน leggibili.

Stavolta non faremo nulla di pericoloso, percui provate e cercando di acquisire dimestichezza.

Buona lettura!

Riassunto della puntata precedente.
Il vostro cliente piรน grosso nonchรจ titolare della megaditta vi ha telefonato perchรจ improvvisamente a due giorni dalla chiusura estiva improvvisamente nessuno riusciva piรน a lavorare con il vostro gestionale!
Tutta la megadittร  รจ ferma!
Vi siete collegati immediamente ed avete concluso che il problema รจ il database che si รจ rovinato!

Era presente un piano di manutenzione perfetto che segnalava errore ed inviava una mail al responsabile EDP.
Qui perรฒ il misterio si infittisce! Il responsabile EDP "giurava"  di non aver ricevuto mai alcuna mail.

Il nostro esperto SQL scopre subito l'arcano: l'invio della mail non era configurato correttamente e nessuna mail รจ mai partita!

Quindi, un insegnamento prezioso: se fate un piano di manutenzione controllate se funziona!

Fine del riassunto della puntata precedente: Il resto sarebbe accaduto molto velocemente.

Dopo aver rispristinano tutti i database disponibili emerse chiara la situazione: tutti i databases erano corrotti!
Torniamo nei panni del nostro esperto di SQL Server.
Come si fa a controllare se un database di SQL Server รจ corrotto o meno?

In questo ci viene in aiuto un comando T-SQL, il DBCC CHECKDB la cui funzione รจ quella di controllare appunto l'integritร  del database.

Eseguite questo comando ed aspettate qualche minuto: 


DBCC CHECKDB ('NOMEDATABASE')

Quando avrร  terminato andate alla fine del report.
Se il messaggio che restituisce รจ questo sotto allora il database non ha errori. 


CHECKDB ha trovato 0 errori di allocazione e 0 errori di coerenza nel database 'XXXX'.
Esecuzione DBCC completata. Se sono stati visualizzati messaggi di errore DBCC, rivolgersi all'amministratore di sistema.

In caso contrario scorretelo e cercate le righe in rosso e troverete le tabelle che hanno un problema.

Nel nostro caso invece la situazione si rileva essere anche peggiore.

Nel nostro caso il comando DBCC non arrivava neppure a controllare le tabelle presenti all'interno del database ma si bloccava prima.

Cosa ci dice questo errore?

Dice che ad essersi รจ rovinata non una tabella utente bensรฌ una tabella di sistema.

Restituisce anche un errore (il numero 9787) ma se lo cercate sul sito della Microsoft si legge che l'unica opzione รจ quella di effettuare un restore da un database integro (...oppure di rivolgersi direttamente alla MicroSoft)


Messaggio 7987, livello 16, stato 1, riga 33
Controlli preliminari su tabella di sistema: per l'ID di oggetto 3 รจ definito un collegamento a catena non corrispondente. (1:772003)->next = (1:26094), ma (1:26094)->prev = (1:2494249). Istruzione di controllo interrotta a causa di un errore irreversibile.
Messaggio 8930, livello 16, stato 43, riga 33
Errore di database: metadati incoerenti per il database 27. Questo errore non puรฒ essere corretto e impedisce l'ulteriore elaborazione DBCC. Eseguire un ripristino da un backup.
Risultati DBCC per 'DATABASE_DA_VERIFICARE'.
CHECKDB ha trovato 0 errori di allocazione e 0 errori di coerenza nel database 'DATABASE_DA_VERIFICARE'.

Per inciso il messaggio spiega bene anche qual'รจ il tipo di errore che si รจ verificato.
In breve il database รจ composto da una serie di pagine che sono legate tra di loro come in una lista doppiamente collegata.

In ogni pagina รจ presente un campo NEXT che punta alla pagina successiva.
E anche presente un campo PREV che invece punta alla pagine precedente
.

L'errore (che rivela anche il tipo di controllo che il DBCC esegue) dice che esiste una pagina che ha un problema di collegamento:

La pagina 1:772003 punta tramite il campo NEXT alla pagina 1:26094 ma
la pagina 1:26094 punta attraverso il campo PREV non alla pagina 1:772003 ma alla pagina 1:2494249.



Ma torniamo a noi.

Giร  certo un database integro ...solo che noi non ne abbiamo nessuno!

In questi casi, in cui ad essere rovinato non sono le tabelle utente,  la soluzione migliore diventa quella di travasare tutti i dati su di un database che abbia la stessa struttura da integra.

Per fortuna noi l'avevamo, era un backup datato di un azienda di prova ma tanto bastava.

Abbiamo quindi scriptato tutta la struttura del database "datato" tramite la funzione standard del Management studio:



Poi abbiamo travasato i dati dal database corrotti a quello sano tabella per tabella.

La megaditta era salva!


A proposito: non vi ho raccontato di come ho fatto a capire che tutte le tabelle erano leggibili e neppure vi ho fatto vedere come recuperari i dati nel caos non avessimo avuto un database con la struttura sana da cui partire (vi avverto giร  da ora: occorre andare molto piรน in profonditร ..)
 
Non sarร  per invogliarvi a leggere il mio prossimo "pezzo" ?
 
 
Ciao ed al prossimo post!
Luca
 

 









Comments

I Post piรน popolari

Speaking to Sql Server, sniffing the TDS protocol

SQL Server, find text in a Trigger, Stored Procedures, View and Function. Two ways and what ways is better

SQL Server, Avoid that damn Table Spool!