Division de DBCC CHECKDB sur plusieurs jours

10

Je travaille sur l'implémentation de la méthode de Paul Randal pour répartir manuellement DBCC CHECKDB sur plusieurs jours pour les très grandes bases de données, qui consiste essentiellement en:

  • Diviser les tables de la base de données à peu près également entre 7 compartiments
  • Exécution d'un DBCC CHECKALLOC deux fois par semaine
  • Exécution d'un DBCC CHECKCATALOG une fois par semaine
  • Exécution d'une table de contrôle DBCC sur un compartiment chaque jour de la semaine

Quelqu'un a-t-il utilisé cette technique? Des scripts existants?

Je crains que cela ne couvre pas tout ce que fait CHECKDB; la documentation Books Online pour CHECKDB indique qu'en plus de CHECKALLOC, CHECKCATALOG et CHECKTABLE, il:

  • Valide le contenu de chaque vue indexée de la base de données.
  • Valide la cohérence au niveau des liens entre les métadonnées de table et les répertoires et fichiers du système de fichiers lors du stockage de données varbinaires (max) dans le système de fichiers à l'aide de FILESTREAM. (SQL 2008 uniquement)
  • Valide les données Service Broker dans la base de données.

Donc, voici mes questions:

  1. Ces vérifications supplémentaires sont-elles nécessaires / importantes? (Les vues indexées me concernent probablement un peu plus, je ne pense pas que nous utilisons Service Broker ou FILESTREAM pour le moment.)

  2. Si oui, existe-t-il des moyens d'effectuer ces vérifications supplémentaires séparément?

  3. CHECKALLOC et CHECKCATALOG semblent fonctionner très rapidement, même sur de grandes bases de données. Une raison de ne pas les exécuter tous les jours?

(Remarque: ce sera une routine standard pour des milliers de bases de données existantes sur des centaines de serveurs, ou au moins toutes les bases de données d'une certaine taille. Cela signifie que des options telles que la restructuration de toutes les bases de données pour utiliser CHECKFILEGROUP ne sont pas vraiment pratiques pour nous.)

BradC
la source
Paul a répondu à une version de cette question dans les commentaires sur son blog. Il a dit: "Ne vous inquiétez pas de la validation de la vue indexée. Elle est désactivée par défaut à partir de 2008 car elle n'a pas trouvé de problème."
BradC
Je travaille pour faire la même chose - des conseils / astuces que vous avez trouvés, car vous avez probablement déjà mis en œuvre cela?
scsimon
1
@scsimon Je l'ai bien fonctionné, voir cette question connexe pour la stratégie spécifique que j'ai utilisée pour diviser les tables. Je pense que j'ai finalement fait une liste principale de toutes les tables de toutes les (grandes) bases de données sur l'ensemble du serveur à diviser en "compartiments" quotidiens, ce qui m'a donné une répartition beaucoup plus uniforme que de diviser la liste de chaque base de données individuellement. Petites bases de données Je viens de faire un DBCC complet chaque jour et ne faisais pas partie de la scission.
BradC

Réponses:

6

Ces vérifications supplémentaires sont-elles nécessaires / importantes? (Les vues indexées me concernent probablement un peu plus, je ne pense pas que nous utilisons Service Broker ou FILESTREAM pour le moment.)

Vous pouvez exécuter DBCC CHECKTABLE WITH EXTENDED_LOGICAL_CHECKS directement sur les vues indexées . La vérification des vues indexées peut être problématique dans certaines circonstances , alors soyez prêt à enquêter sur les faux positifs qui en résultent. (Paul Randal mentionne également dans les commentaires de l'article référencé que les faux négatifs sont également possibles, mais je n'en ai aucune expérience directe.)

Si oui, existe-t-il des moyens d'effectuer ces vérifications supplémentaires séparément?

Il n'y a aucune prise en charge pour exécuter le Service Broker ou les FILESTREAMcontrôles séparément, non.

CHECKALLOCet CHECKCATALOGsemblent fonctionner très rapidement, même sur de grandes bases de données. Une raison de ne pas les exécuter tous les jours?

Pas que je sache.


Vous pourriez également envisager de courir DBCC CHECKCONSTRAINTS. Cette vérification n'est pas incluse dans DBCC CHECKDB, quelles que soient les options que vous pouvez spécifier. Vous voudrez peut-être aussi penser à courir de temps en temps CHECKDB, au fur et à mesure des circonstances.

Paul White 9
la source
6

DBCC CHECKDB est vital pour les bases de données SQL Server pour être sûr à 100% qu'il n'y a pas de corruption. Cependant, en raison de la taille massive des bases de données, il est très difficile de trouver une fenêtre de maintenance lorsque vous prétendez être disponible 24h / 24 et 7j / 7. Au fil des ans, l'équipe de SQL Server a mis en œuvre divers mécanismes qui détecteront les formes de corruption les plus courantes, notamment liées à la corruption physique causée par le matériel.

SQL Server 2005 et versions ultérieures ont PAGE_VERIFY = CHECKSUM qui peut vous aider à détecter de manière proactive la corruption physique dans les pages de la base de données, ajoutant ainsi une somme de contrôle à chaque page lors de son écriture sur le système d'E / S et valide la somme de contrôle lors de sa lecture sur le disque.

De plus, une sauvegarde (complète ou différentielle) avec CHECKSUM garantira de détecter toute corruption d'E / S causée par le matériel.

Par conséquent, du côté matériel de la corruption, SQL Server fait un bon travail pour le détecter et le signaler. (Assurez-vous également de définir des alertes importantes concernant la corruption ).

Cela étant dit, corruption toujours logique , erreurs induites par le scribbler - où les pages en mémoire sont corrompues soit par du code tiers s'exécutant à l'intérieur du processus SQL Server, soit par des pilotes ou d'autres logiciels disposant de privilèges suffisants s'exécutant en mode noyau Windows et / ou SQL Server Les bogues , etc. sont indétectables en utilisant les méthodes ci-dessus et donc CHECKDB apparaît dans l'image.

DBCC CHECKDB effectue des vérifications plus approfondies qui incluent la vérification des en-têtes de page pour une éventuelle corruption non détectable par aucun autre moyen.

Des scripts existants?

Au lieu de réinventer la roue, je vous recommande fortement de jeter un œil à la solution Ola SQL Server Integrity Check

Exécution efficace de DBCC CHECKDB:

Vous avez juste besoin d'être créatif lorsque vous êtes serré dans la fenêtre de maintenance avec d'énormes bases de données ou un grand nombre de bases de données sur lesquelles exécuter CHECKDB.

Après avoir suivi la formation SQLSkills, ce que j'ai implémenté dans mon environnement est:

  • donner la priorité aux tables qu'il est essentiel de vérifier.
  • séparez les tables en groupes avec des priorités différentes, puis exécutez DBCC CHECKTABLEavec l'exécution DBCC CHECKALLOCetDBCC CHECKCATALOG
  • Créez une table de travail qui stockera les noms de table avec des priorités. Assurez-vous simplement que toutes les tables à haute priorité (qui sont massivement grandes) ne sont pas dans un groupe, sinon votre CHECKDB ne se terminera pas du tout.
  • Vous pouvez même avoir une colonne de délai d'attente dans votre table de travail qui orchestrera quand votre CHECKDB sera tué une fois qu'il aura passé la fenêtre de maintenance
  • Ajoutez le temps nécessaire à l'exécution de chaque table DBCC CHECKTABLE, DBCC CHECKALLOCet DBCC CHECKCATALOG. Afin que vous puissiez avoir une idée du temps qu'il faut en général pour exécuter vos chèques.
  • Vous pouvez même exécuter l' NOINDEXoption, car elle accélérera l'opération car elle ne vérifie pas les index non clusterisés sur les tables utilisateur. Cela a un certain avantage car il n'est pas aussi critique que la corruption de données car aucune donnée n'est perdue et vous pouvez supprimer et recréer l'index si nécessaire.

De toute évidence, l'édition Enterprise peut tirer parti de l'exécution parallèle des instructions DBCC, mais faites attention au paramètre MAXDOP car il pourrait finir par prendre tout votre processeur. Cela peut être fortement limité par le gouverneur de ressources.

Remarque: Si vous avez une colonne SPARSE, votre CHECKDB sera lent comme décrit ici .

Enfin, comment prévenir la corruption de la base de données en utilisant tous les outils disponibles + votre confiance dans le système matériel de votre serveur de base de données et, surtout, la valeur de vos données.

Quelques excellentes références:

Kin Shah
la source