web-dev-qa-db-fra.com

Diviser DBCC CheckDB sur plusieurs jours

Je travaille sur la mise en œuvre de Paul Randal's méthode d'épandage manuellement DBCC CheckDB sur plusieurs jours Pour de très grandes bases de données, qui consiste essentiellement à:

  • Diviser les tables dans la base de données à peu près égale entre 7 godets
  • Exécution d'un DBCC Checkalloc deux fois par semaine
  • Exécution d'une checkcatalog DBCC une fois par semaine
  • Exécution d'une liste de contrôle DBCC sur un godet chaque jour de la semaine

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

Je crains que cela ne couvre peut-être pas tout ce que CheckDB fait; la documentation en ligne de livres pour CheckDB indique qu'en plus de Checkalloc, CheckCatalog and CheckTable, c'est aussi:

  • Validate le contenu de chaque vue indexée dans la base de données.
  • Validez la cohérence du niveau de liaison entre les métadonnées de table et les répertoires système de fichiers et les fichiers lors de la stockage de données Varbinary (MAX) dans le système de fichiers à l'aide de FileStream. (SQL 2008 seulement)
  • Validate les données de courtier de service dans la base de données.

Donc, voici mes questions:

  1. Ces contrôles supplémentaires sont-ils nécessaires/importants? (Les vues indexées sont probablement un peu plus discutées pour moi, je ne pense pas que nous utilisions le courtier de service ou le filtream encore.)

  2. Si oui, existe-t-il des moyens d'exécuter ces contrôles supplémentaires séparément?

  3. Checkalloc et CheckCatalog semblent courir très rapidement, même sur de grands dbs. Toute raison de ne pas courir tous les jours?

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

10
BradC

DBCC CheckDB est Vital pour les bases de données SQL Server pour être sûr de 100% qu'il n'y a pas de corruption. Toutefois, en raison des bases de données de taille massive, c'est très difficile à trouver une fenêtre de maintenance lorsque vous prétendez être 24x7. Au fil des ans, l'équipe SQL Server a mis en place 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 UP a page_verify = checksum qui peut vous aider à détecter de manière proactive la corruption physique dans les pages de base de données, ajoutant ainsi une somme de contrôle à chaque page, car il est écrit sur le système d'E/S et valide la somme de contrôle est lu sur le disque.

De plus, Sauvegarde (complet ou différentiel) avec checksum garantira de détecter toute corruption d'E/S provoquée par le matériel.

Par conséquent, du côté matériel de la corruption, SQL Server fait un bon travail de la détection et de la signaler. (Assurez-vous de définir Alertes liées à la corruption importantes aussi).

Qui étant dit, toujours corruption logique, erreurs de gribouilleur induit - Lorsque des pages en mémoire sont corrompues soit par le code tiers en cours d'exécution à l'intérieur. Le processus SQL Server ou par des pilotes ou un autre logiciel avec des privilèges suffisants en mode Windows Kernel et/ou bugs SQL Server, etc. sont indétectables en utilisant des méthodes ci-dessus et donc [~ # ~ ~] checkdb [~ # ~] entre dans l'image.

DBCC CheckDB effectue une vérification plus complète qui inclut des en-têtes de page de vérification pour une corruption éventuelle qui ne sont détectables par aucun autre moyen.

Des scripts existants là-bas?

Au lieu de réinventer la roue, je vous recommande vivement de jeter un coup d'œil sur Solution de vérification de l'intégrité SQL Server de OLA

Exécution efficace DBCC CheckDB:

Vous devez simplement être créatif lorsque vous êtes serré dans la fenêtre de maintenance ayant d'énormes bases de données ou un nombre élevé de bases de données pour exécuter CheckDB sur.

Après avoir assisté à la formation SQLSKILLS, ce que j'ai mis en œuvre dans mon environnement est:

  • hiérarchiser sur quelles tables sont essentielles à vérifier.
  • séparez les tables en groupes avec différentes priorités, puis courez DBCC CHECKTABLE avec la course DBCC CHECKALLOC et DBCC CHECKCATALOG
  • Créez une table de travailleurs qui stockera les noms de table avec des priorités. Assurez-vous simplement que toutes les tables hautes prioritaires (qui sont massivement grandes) ne sont pas dans un groupe d'autre que votre checkdb ne sera pas terminé du tout.
  • Vous pouvez même avoir une colonne de délai d'attente dans votre table ouvrière qui orchestrera lorsque votre checkdb sera tué une fois qu'il a passé la fenêtre de maintenance.
  • Ajouter combien de temps il a fallu par table pour exécuter DBCC CHECKTABLE, DBCC CHECKALLOC et DBCC CHECKCATALOG. Pour que vous puissiez avoir une idée de la durée de vie généralement ​​prendre pour vos chèques à courir.
  • Vous pouvez même courir avec l'option NOINDEX car elle accélérera l'opération car elle ne vérifie pas les index non clusters sur les tables d'utilisateur. Cela a un avantage car ce n'est pas si critique que la corruption de données car aucune donnée n'est perdue et que vous pouvez abandonner et recréer l'index si nécessaire.

Évidemment, l'édition Enterprise peut tirer parti de l'exécution parallèle des instructions DBCC, mais recherchez le paramètre MaxDop car cela pourrait finir par prendre tout votre CPU. Cela peut être difficile limité par le gouverneur des ressources.

Remarque: Si vous avez une colonne clairsemée, votre checkdb sera mort lent comme décrit ICI .

Enfin, sa façon de prévenir la corruption de la base de données en utilisant tous les outils d'outils disponibles + votre foi dans votre système de matériel de serveur de base de données et, surtout, la valeur de vos données.

Quelques excellentes références:

6
Kin Shah