Dividere DBCC CHECKDB per più giorni


10

Sto lavorando per implementare il metodo di Paul Randal di diffusione manuale di DBCC CHECKDB su diversi giorni per database molto grandi, che sostanzialmente consiste di:

  • Dividere le tabelle nel database all'incirca equamente tra 7 secchi
  • Esecuzione di DBCC CHECKALLOC due volte a settimana
  • Esecuzione di un DBCC CHECKCATALOG una volta alla settimana
  • Esecuzione di un DBCC CHECKTABLE su un bucket ogni giorno della settimana

Qualcuno ha usato questa tecnica? Qualche script esistente là fuori?

Sono preoccupato che questo in realtà non copra tutto ciò che fa CHECKDB; la documentazione della documentazione online di CHECKDB afferma che, oltre a CHECKALLOC, CHECKCATALOG e CHECKTABLE, anche:

  • Convalida il contenuto di ogni vista indicizzata nel database.
  • Convalida la coerenza a livello di collegamento tra metadati di tabella e directory e file del file system quando si archiviano i dati varbinary (max) nel file system utilizzando FILESTREAM. (Solo SQL 2008)
  • Convalida i dati di Service Broker nel database.

Quindi, ecco le mie domande:

  1. Questi controlli aggiuntivi sono necessari / importanti? (Le visualizzazioni indicizzate sono probabilmente un po 'più preoccupanti per me, non credo che stiamo ancora utilizzando Service Broker o FILESTREAM.)

  2. In tal caso, ci sono modi per eseguire questi controlli aggiuntivi separatamente?

  3. CHECKALLOC e CHECKCATALOG sembrano funzionare molto rapidamente, anche su grandi dbs. Qualche motivo per non eseguirli tutti i giorni?

(Nota: questa sarà una routine standard per migliaia di database esistenti su centinaia di server, o almeno ogni database di una certa dimensione. Ciò significa che opzioni come la ristrutturazione di tutti i database per usare CHECKFILEGROUP non sono davvero pratiche per noi.)


Paul ha risposto a una versione di questa domanda nei commenti sul suo blog. Ha dichiarato: "Non preoccuparti della convalida della vista indicizzata. È disattivata per impostazione predefinita dal 2008 in poi perché non ha riscontrato problemi".
BradC,

Sto lavorando per fare lo stesso: qualche consiglio / gotcha che hai trovato, dal momento che probabilmente lo hai già implementato?
scsimon,

1
@scsimon Ho capito che funziona bene, vedi questa domanda correlata per la strategia specifica che ho usato per dividere le tabelle. Penso che alla fine ho creato un elenco principale di tutte le tabelle in tutti i database (di grandi dimensioni) dell'intero server da dividere nei "bucket" giornalieri, il che mi ha dato una suddivisione molto più uniforme rispetto alla divisione dell'elenco di ciascun database singolarmente. Database più piccoli Ho appena fatto un DBCC completo ogni giorno e non facevo parte della divisione.
BradC,

Risposte:


6

Questi controlli aggiuntivi sono necessari / importanti? (Le visualizzazioni indicizzate sono probabilmente un po 'più preoccupanti per me, non credo che stiamo ancora utilizzando Service Broker o FILESTREAM.)

È possibile eseguire DBCC CHECKTABLE WITH EXTENDED_LOGICAL_CHECKS direttamente sulle viste indicizzate . Il controllo delle viste indicizzate può essere problematico in determinate circostanze , quindi preparati a indagare su eventuali falsi positivi che ne risultano. (Paul Randal menziona anche nei commenti all'articolo di riferimento che sono possibili anche falsi negativi, ma non ne ho esperienza diretta.)

In tal caso, ci sono modi per eseguire questi controlli aggiuntivi separatamente?

Non esiste supporto per l'esecuzione del Service Broker o per i FILESTREAMcontrolli separatamente, no.

CHECKALLOCe CHECKCATALOGsembra funzionare molto rapidamente, anche su grandi dbs. Qualche motivo per non eseguirli tutti i giorni?

Non che ne sia a conoscenza.


Potresti anche considerare di correre DBCC CHECKCONSTRAINTS. Questo controllo è non è incluso in DBCC CHECKDB, indipendentemente da eventuali opzioni si può specificare. Puoi anche pensare a correre occasionalmenteCHECKDB , quando e quando le circostanze lo consentono.


6

DBCC CHECKDB è vitale per i database di SQL Server per essere sicuri al 100% che non vi sia corruzione. Tuttavia, a causa delle dimensioni dei database di dimensioni enormi, è molto difficile trovare una finestra di manutenzione quando si afferma di essere 24x7. Nel corso degli anni, il team di SQL Server ha implementato vari meccanismi che rileveranno le forme più comuni di corruzione, in particolare quelle correlate alla corruzione fisica causata dall'hardware.

SQL Server 2005 e versioni successive hanno PAGE_VERIFY = CHECKSUM che può aiutarti a rilevare in modo proattivo la corruzione fisica nelle pagine del database aggiungendo così un checksum a ciascuna pagina mentre viene scritto sul sistema I / O e convalida il checksum mentre viene letto dal disco.

Inoltre, il backup (completo o differenziale) con CHECKSUM garantirà il rilevamento di eventuali danni I / O causati dall'hardware.

Quindi, dal lato hardware della corruzione, SQL Server fa un buon lavoro nel rilevarlo e nel segnalarlo. (Assicurati di impostare anche importanti avvisi relativi alla corruzione ).

Detto questo, la corruzione ancora logica , lo scribbler ha causato errori - in cui le pagine in memoria sono danneggiate dal codice di terze parti in esecuzione all'interno del processo di SQL Server o da driver o altri software con privilegi sufficienti in esecuzione in modalità kernel di Windows e / o SQL Server Bug , ecc. Non sono rilevabili usando i metodi sopra e quindi CHECKDB appare in figura.

DBCC CHECKDB esegue controlli più approfonditi che includono il controllo delle intestazioni di pagina per possibili danni che non sono rilevabili con nessun altro mezzo.

Qualche script esistente là fuori?

Invece di reinventare la ruota, ti consiglio vivamente di dare un'occhiata alla soluzione di controllo dell'integrità di SQL Server di Ola

Esecuzione efficiente di DBCC CHECKDB:

Devi solo essere creativo quando sei stretto nella finestra di manutenzione con enormi database o un elevato numero di database su cui eseguire CHECKDB.

Dopo aver frequentato la formazione SQLSkills, ciò che ho implementato nel mio ambiente è:

  • dare priorità a quali tabelle sono fondamentali per il controllo.
  • separare le tabelle in gruppi con priorità diverse e quindi eseguire DBCC CHECKTABLEinsieme a running DBCC CHECKALLOCeDBCC CHECKCATALOG
  • Creare una tabella di lavoro che memorizzerà i nomi delle tabelle con priorità. Assicurati solo che tutte le tabelle con priorità elevate (che sono enormemente grandi) non appartengano a un gruppo altrimenti il ​​tuo CHECKDB non verrà completato.
  • Puoi anche avere una colonna di timeout nella tua tabella di lavoro che orchestrerà quando CHECKDB verrà ucciso una volta superata la finestra di manutenzione
  • Aggiungi il tempo impiegato per ogni tabella a correre DBCC CHECKTABLE, DBCC CHECKALLOCe DBCC CHECKCATALOG. In modo che tu possa avere un'idea di quanto tempo richiede solitamente l'esecuzione dei controlli.
  • È anche possibile eseguire con l' NOINDEXopzione in quanto accelererà l'operazione in quanto non controlla gli indici non cluster sulle tabelle utente. Ciò presenta alcuni vantaggi in quanto non è così critico come il danneggiamento dei dati poiché non vengono persi dati e, se necessario, è possibile eliminare e ricreare l'indice.

Ovviamente, l'edizione Enterprise può trarre vantaggio dall'esecuzione parallela delle istruzioni DBCC, ma cerca l'impostazione MAXDOP in quanto potrebbe finire per prendere tutta la tua CPU. Questo può essere fortemente limitato da Resource Governor.

Nota: se si dispone della colonna SPARSE, CHECKDB sarà molto lento come descritto qui .

Infine, è come prevenire la corruzione del database utilizzando tutto il set di strumenti disponibili + la tua fiducia nel sistema hardware del tuo server di database e, soprattutto, il valore dei tuoi dati.

Alcuni riferimenti eccellenti:

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.