Da: Brady Upton | Aggiornato: 2016-07-26 | Commenti (2) | Correlati: Altri >comandi della console di database DBCC

Problema

La corruzione del database di SQL Server può essere un problema e può causare seri danni a un database. Se sei un DBA esperto, allora probabilmente hai delle protezioni in atto per rilevare questo, ma nel corso degli anni ho visto centinaia di SQL Server senza alcun metodo di rilevamento e questo è un problema. Ci sono alcuni modi per rilevare la corruzione del database, ma questo suggerimento si concentrerà più su DBCC CHECKDB.

Soluzione

Si può o non si può aver sentito parlare delle dichiarazioniDBCC (comandi della console del database). Queste istruzioni sono usate per eseguire diverse operazioni nel vostro database e possono essere suddivise in quattro categorie: Manutenzione, Varie, Informazioni e Convalida. Uso alcuni dei comandi DBCC quotidianamente, ma nessuno più di DBCC CHECKDB.

Cos’è SQL Server DBCC CHECKDB

DBCC CHECKDB, daMicrosoft MSDN Library, controlla l’integrità logica e fisica di tutti gli oggetti nel database specificato eseguendo le seguenti operazioni:

  • Esegue DBCC CHECKALLOC sul database – Controlla la coerenza delle strutture di allocazione dello spazio su disco per un database specificato.
  • Esegue DBCC CHECKTABLE su ogni tabella e vista nel database – Controlla l’integrità di tutte le pagine e strutture che compongono la tabella o la vista indicizzata.
  • Esegue DBCC CHECKCATALOG sul database – Controlla la coerenza del catalogo all’interno del database.
  • Valida il contenuto di ogni vista indicizzata nel database.
  • Valida la coerenza a livello di link tra i metadati della tabella e le directory e i file del file system quando si memorizzano dati varbinari (max) nel file system usando FILESTREAM.
  • Valida i dati del Service Broker nel database

Se hai mai eseguito DBCC CHECKDB sai che ci vuole un po’ di tempo per i database grandi.Ora che conosci tutti i passi che vengono eseguiti, puoi capire perché ci vuole tempo per completarlo.

Come può aiutarmi SQL Server DBCC CHECKDB? Può causare tutti i tipi di problemi all’interno del databasethat che possono includere risultati di dati errati, istruzioni SQL non riuscite, e in alcuni casi può mettere fuori uso l’intera istanza SQL. DBCC CHECKDB ti avverte della corruzione in modo che tu possa sistemarla prima che (si spera) diventi troppo grave.

Come si usa SQL Server DBCC CHECKDB?

DBCC CHECKDB è abbastanza semplice. Ci sono alcune opzioni che puoi usare con l’istruzione e ne esamineremo alcune nella prossima sezione, ma la sintassi di base assomiglia a questa:

DBCC CHECKDB ('DatabaseName') 

Praticamente semplice.

Automatizza SQL Server DBCC CHECKDB

Ovviamente, non vuoi accedere ogni mattina ed eseguire questa istruzione su ogni database, quindi puoi automatizzare questo processo usando alcuni metodi diversi:

  • Piani di manutenzione di SQL Server -I piani di manutenzione sono parte di SQL Server fuori dalla scatola (a meno che tu non stia usando la Express Edition). Non mi piace usare i piani di manutenzione per la maggior parte, ma non mi dispiace usarli per questo tipo di compito. Nella casella degli strumenti del piano di manutenzione dovrai usare il compito Controlla integrità del database. L’unica opzione configurabile è quella di includere gli indici, quindi non è molto facile da usare, ma in alcuni casi è tutto ciò di cui avete bisogno. Di nuovo, parleremo di altre opzioni nella prossima sezione.
  • Script personalizzati – Gli script personalizzati sono di solito quelli che uso e offrono la migliore flessibilità per quanto riguarda l’aggiunta delle opzioni che vuoi. I miei go-toscripts sono già creati e gratuiti da Ola Hallengren. Ha fatto un lavoro meraviglioso nel crearli e condividerli con il mondo. GrazieOla!
    • Guarda gli script su MSSQLTips.com:
    • Esegui la manutenzione con i database di SQL Server in modalità Full Recovery
    • Piani di manutenzione del database di SQL Server e gestione dei file di backup
    • Esegui la manutenzione di SQL Server senza finestra di manutenzione

Opzioni DBCC CHECKDB di SQL Server

Ci sono alcune opzioni da usare con DBCC CHECKDB e qui ne esaminerò alcune delle più popolari:

  • NOINDEX – Specifica che i controlli intensivi degli indici non raggruppati per le tabelle utente non dovrebbero essere eseguiti. Questo diminuisce il tempo di overallexecution. NOINDEX non influisce sulle tabelle di sistema perché i controlli di integrità vengono sempre eseguiti sugli indici delle tabelle di sistema.
  • NO_INFOMSGS – Sopprime tutti i messaggi informativi.
  • PHYSICAL_ONLY – Limita il controllo all’integrità della struttura fisica delle intestazioni delle pagine e dei record e alla coerenza di allocazione del database. Questo controllo è progettato per fornire una piccola verifica della consistenza fisica del database, ma può anche rilevare pagine strappate, errori di checksum, e comuni guasti hardware che possono compromettere i dati di un utente.
  • TABLOCK – Fa sì che DBCC CHECKDB ottenga i lock invece di usare uno snapshot interno del database. Questo include un blocco esclusivo (X) a breve termine sul database. TABLOCK farà sì che DBCC CHECKDB venga eseguito più velocemente su un database sotto carico pesante, ma diminuisce la concorrenza disponibile sul database mentreDBCC CHECKDB è in esecuzione.
  • DATA_PURITY – Fa sì che DBCC CHECKDB controlli il database per valori di colonna che non sono validi o fuori range. Per esempio, DBCC CHECKDB rileva colonne con valori di data e ora che sono più grandi o meno dell’intervallo accettabile per il tipo di dati datetime; o colonne di tipo decimale o approssimativo-numerico con valori di scala o precisione che non sono validi.

Andremo oltre alcune delle opzioni di RIPARAZIONE in un’altra sezione più avanti.

Quanto spesso dovrei controllare la corruzione di SQL Server?

Ogni minuto di ogni giorno. Sto solo scherzando.

Se hai una finestra di manutenzione giornaliera, sarebbe bello controllare la corruzione dei dati ogni giorno. Più velocemente lo si può prendere, meno danno può fare. Ho notato che molte persone lo eseguono nel fine settimana, specialmente con i database più grandi. Non c’è niente di giusto o sbagliato in questo, assicurati solo di averlo programmato periodicamente.

Devo eseguire DBCC CHECKDB nel mio ambiente di produzione?

No, beh sì. Più o meno.

Per controllare la corruzione dei dati non serve eseguire DBCC CHECKDB sul tuo ambiente di test…A MENO che tu non ripristini una copia del tuo ambiente di produzione per testarlo e poi eseguirlo. BRILLANTE!

Si può chiedere se alcune opzioni HA sono adatte come AlwaysOn, LogShipping, ecc. No, devi controllare il tuo ambiente di produzione *live*.

Ora che DBCC CHECKDB è configurato e funzionante, cosa devo cercare?

Congratulazioni! Hai DBCC CHECKDB automatizzato e funzionante, ma ora cosa? Se hai configurato un SQL ServerAgent Job, assicurati di aver impostato la posta del database, un operatore e una notifica sul lavoro. Se il lavoro ha successo, allora continuate con la vostra bella giornata. Se il lavoro fallisce, allora abbiamo del lavoro da fare.

Potresti vedere un errore come questo:

Il conteggio delle pagine di dati In-row USED per l’oggetto “tablename”, index ID 2, partitionID 608313809829888, alloc unit ID 608313809829888 (tipo In-row data) non è corretto.Run DBCC UPDATEUSAGE. (Errore 2508) Il pagecount RSVD dei dati In-row per l’oggetto “tablename”, indice ID 2, par… Il passo non è riuscito.

o questo:

Oggetto ID 2088535921, indice ID 0, partizione ID 72345201021503994, allocare unitID 72345201051571606 (tipo In-row data): La pagina (1:94299) non può essere elaborata. Msg 8939, Level 16, State 98, Line 1 Table error:Object ID 2088535921, index ID 0, partition ID 72345201021503994, alloc unitID 72345201051571606 (type In-row data), page (1:94299). Test (IS_OFF (BUF_IOERR,pBUF->bstat)) fallito. CHECKDB ha trovato 0 errori di allocazione e 2 errori di coerenza nella tabella ‘tablename’ (ID oggetto 2088535921). CHECKDB ha trovato 0 errori di allocazione e 2 errori di coerenza nel database ‘tablename’. repair_allow_data_lossè il livello minimo di riparazione per gli errori trovati da DBCC CHECKDB (Database).

Primo, non farti prendere dal panico. Secondo, controlla i backup. Gli errori di DBCC CHECKDB di solito ti dicono cosa deve essere fatto.

Per il primo errore un DBCC UPDATEUSAGE correggerà le imprecisioni nel conteggio delle pagine e delle righe nelle viste di catalogo. Abbastanza innocuo.

Il secondo errore riporta la corruzione dei dati. L’errore menziona l’uso di repair_allow_data_loss come livello minimo di riparazione. Questo significa che puoi eseguire l’istruzione con questo argomento, ma potresti perdere dei dati. Questo è il motivo per cui raccomando sempre di ripristinare un backup se è possibile. Devi assicurarti che il backup non contenga dati corrotti e vuoi essere sicuro che non ci sia perdita di dati.

Come riparare un database SQL Server

Se non hai un backup, potremmo aver bisogno di usare DBCC CHECKDB con un’opzione di riparazione.Ecco le opzioni di riparazione che sono disponibili da usare. Queste possono funzionare o meno e devono essere usate come ultima risorsa:

  • REPAIR_ALLOW_DATA_LOSS – Tenta di riparare tutti gli errori segnalati.Queste riparazioni possono causare alcune perdite di dati.
  • REPAIR_REBUILD – Esegue riparazioni che non hanno possibilità di perdita di dati. Questo può includere riparazioni veloci, come la riparazione di righe mancanti in indici non clusterizzati, e riparazioni che richiedono più tempo, come la ricostruzione di un indice.

Come ho detto sopra, è molto importante avere fino a databackup per recuperare dalla corruzione. La corruzione non importa quanti dati avete, quale versione di SQL state eseguendo, o quanto sia sofisticato il vostro datacenter.

Mi sento abbastanza bene, ma cos’altro posso usare per proteggere le mie istanze SQL?

DBCC CHECKDB dovrebbe essere eseguito su ogni istanza SQL che avete, ma ci sono un paio di altri modi che possono aiutare a rilevare/prevenire la corruzione dei dati.

  • Avvisi dell’agente SQL Server – Brian Kelley ha scritto un bel suggerimento su questo argomento qui.
  • Verifica della pagina – Assicuratevi che i vostri database stiano usando la verifica della paginaCHECKSUM. Se stai ancora eseguendo SQL 2005 o inferiore questo non è disponibile, ma dopo l’aggiornamento assicurati di cambiare questa impostazione. Per vedere le impostazioni di verifica della pagina usa la seguente dichiarazione:
select name, page_verify_option_desc from sys.databases 
Passi successivi
  • Assicurati di controllare la libreriaMSDN per dettagli più approfonditi riguardo DBCC CHECKDB
  • MSSQLTips.com ha una bella collezione di suggerimenti sui controlli di consistenza del database che possono essere utili.

Ultimo aggiornamento: 2016-07-26

Informazioni sull’autore
Brady Upton è un amministratore di database e superstar di SharePoint a Nashville, TN.
Vedi tutti i miei consigli
Risorse correlate

  • Altri consigli per SQL Server DBA…

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.