Automatisation de la page DBCC

En 2006, Paul Randal a documenté la PAGE DBCC sur son blog Microsoft à https://blogs.msdn.com/b/sqlserverstorageengine/archive/2006/06/10/625659.aspx. Dans son post, vous remarquerez que pour renvoyer la sortie de la PAGE DBCC à l’écran, vous devez d’abord activer l’indicateur de trace 3604. Le billet de blog ci-dessus montre quelques exemples des résultats et les utilise pour d’autres actions. Malheureusement, cette méthode nécessite une intervention manuelle pour obtenir les données nécessaires de la page afin de pouvoir l’utiliser davantage.

Vous savez, ce serait bien si l’intervention manuelle pouvait être supprimée et automatiser complètement la tâche que vous recherchez. Cet article de blog va vous montrer comment cela peut être fait, et il donnera quelques exemples de le faire.

Dans mon dernier article de blog, j’ai introduit un paramètre facultatif pour plusieurs commandes DBCC: AVEC TABLERESULTS. Cela renvoie la sortie au format tabulaire, de manière à permettre à la sortie d’être consommée. Il s’avère que ce paramètre facultatif fonctionne également avec la PAGE DBCC. Vous pouvez le voir en examinant la page d’informations sur la base de données (page 9) de la base de données principale:

Code source
 PAGE DBCC ('master', 1, 9, 3) AVEC TABLERESULTS;

Cette instruction, qui peut être exécutée sans l’indicateur trace, renvoie les données de la page en 4 colonnes : ParentObject, Object, Field et VALUE. Il s’avère que cette page particulière de chaque base de données contient de nombreuses informations intéressantes. Automatisons la saisie d’une information spécifique de cette page:

Code source
 SI OBJECT_ID('tempdb.dbo.#DBCCPAGE') N'EST PAS UNE TABLE NULLE #DBCCPAGE; CRÉER UNE TABLE #DBCCPAGE(ParentObject VARCHAR(255), VARCHAR(255), Champ VARCHAR(255), VARCHAR(255)); INSÉRER DANS #DBCCPAGEEXECUTE('PAGE DBCC("master", 1, 9, 3) AVEC TABLERESULTS; '); SÉLECTIONNEZ LastGoodDBCCDate = CONVERT(DATETIME, VALUE) À PARTIR DU champ #DBCCPAGEWHERE = 'Dbi_dbcclastconnu';

Ce merveilleux extrait de code renvoie la dernière fois qu’un CHECKDB DBCC réussi a été exécuté sur la base de données principale. C’est gentil, ça ? Lorsque vous découvrez un serveur sur lequel la tâche CHECKDB a échoué au point que la tâche n’a échoué que dans l’historique des tâches, vous pouvez maintenant savoir combien de temps cela fait depuis sa dernière exécution réussie.

Le « truc » pour que cela fonctionne est d’encapsuler la commande DBCC sous forme de chaîne et de l’appeler avec la fonction EXECUTE(). Ceci est utilisé dans le cadre d’une instruction INSERT INTO /EXECUTE, de sorte que les résultats de la PAGE DBCC sont insérés dans une table (dans ce cas, une table temporaire est utilisée, bien qu’une variable de table ou une table permanente puissent également être utilisées). Il y a trois étapes simples à ce processus:

  1. Créez une table (permanente/temporaire) ou une variable de table pour contenir la sortie.
  2. Insérez dans ce tableau les résultats de l’instruction de PAGE DBCC en utilisant INSERT INTO/EXECUTE.
  3. Sélectionnez les données que vous recherchez dans le tableau.

En utilisant un curseur, vous pouvez facilement parcourir toutes les bases de données de votre instance pour obtenir la date de la dernière exécution réussie d’une DBCC CHECKDB contre elles. Ce qui suit utilise sp_MSforeachdb (qui utilise lui-même un curseur pour parcourir toutes les bases de données) pour ce faire:

Code source
 SI OBJECT_ID('tempdb.dbo.#DBCCPAGE') N'EST PAS UNE TABLE DE DÉPÔT NULLE #DBCCPAGE; SI OBJECT_ID('tempdb.dbo.#CheckDBDates') N'EST PAS UNE TABLE DE DÉPÔT NULLE #CheckDBDates;CREATE TABLE #DBCCPAGE ( ParentObject VARCHAR(255), VARCHAR(255), Field VARCHAR(255), VARCHAR(255));CREATE TABLE #CheckDBDates ( database_name sysname, LastCheckDB DATETIME); EXECUTE sp_MSforeachdb 'TRUNCATE TABLE #DBCCPAGE;INSERT INTO #DBCCPAGE EXECUTE (''DBCC PAGE (''''?'''', 1, 9, 3) WITH TABLERESULTS;'');INSERT INTO #CheckDBDatesSELECT ''?'', CONVERT(DATETIME, VALUE)FROM #DBCCPAGEWHERE Field = ''dbi_dbccLastKnownGood'';'; SELECT database_name, LastCheckDBFROM #CheckDBDates;

Et ici, nous avons toutes les bases de données sur votre instance, et la date à laquelle DBCC CHECKDB a été exécutée pour la dernière fois avec succès – enfin, du moins pour les bases de données que sp_MSforeachdb n’a pas ignorées (voir https://www.mssqltips.com/sqlservertip/2201/making-a-more-reliable-and-flexible-spmsforeachdb/ pour plus d’informations à ce sujet).

En résumé, en utilisant l’option « AVEC TABLERESULTS » de DBCC, nous pouvons automatiser les processus qui utilisent la PAGE DBCC, au lieu d’avoir besoin d’une intervention manuelle pour vous frayer un chemin à travers cela.

Dans les prochains versements, nous examinerons d’autres utilisations de l’utilisation de « WITH TABLERESULTS » pour automatiser la sortie DBCC.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.