Automatisierung der DBCC-Seite

Bereits 2006 dokumentierte Paul Randal die DBCC-SEITE in seinem Microsoft-Blog unter https://blogs.msdn.com/b/sqlserverstorageengine/archive/2006/06/10/625659.aspx. In seinem Beitrag werden Sie feststellen, dass Sie zuerst das Trace-Flag 3604 aktivieren müssen, um die Ausgabe von der DBCC-SEITE auf den Bildschirm zurückzugeben. Der obige Blogbeitrag zeigt einige Beispiele der Ergebnisse und verwendet sie für weitere Aktionen. Leider erfordert diese Methode einen manuellen Eingriff, um die erforderlichen Daten von der Seite abzurufen, um weiter damit arbeiten zu können.

Wissen Sie, es wäre sicher schön, wenn der manuelle Eingriff entfernt und die gesuchte Aufgabe vollständig automatisiert werden könnte. Dieser Blogbeitrag wird Ihnen zeigen, wie dies getan werden kann, und es wird ein paar Beispiele dafür geben.

In meinem letzten Blogbeitrag habe ich eine optionale Einstellung für mehrere DBCC-Befehle eingeführt: MIT TABLERESULTS . Dies gibt die Ausgabe im Tabellenformat in einer Weise zurück, die es ermöglicht, die Ausgabe zu verbrauchen. Wie sich herausstellt, funktioniert diese optionale Einstellung auch mit DBCC PAGE. Sie können dies sehen, indem Sie die Datenbankinformationsseite (Seite 9) der Master-Datenbank untersuchen:

Quellcode
 DBCC-SEITE ('Master', 1, 9, 3) MIT TABELLENERGEBNISSEN;

Diese Anweisung, die ohne das Trace-Flag ausgeführt werden kann, gibt die Daten auf der Seite in 4 Spalten zurück: ParentObject, Object, Field und VALUE . Wie sich herausstellt, enthält diese spezielle Seite jeder Datenbank viele interessante Informationen. Automatisieren wir das Abrufen einer bestimmten Information aus dieser Seite:

Quellcode
 WENN OBJECT_ID('tempdb.dbo.#DBCCPAGE') IST NICHT NULL DROP TABLE #DBCCPAGE;CREATE TABLE #DBCCPAGE ( ParentObject VARCHAR(255), VARCHAR(255), Field VARCHAR(255), VARCHAR(255));INSERT INTO #DBCCPAGEEXECUTE ('DBCC PAGE ("master", 1, 9, 3) WITH TABLERESULTS;'); SELECT LastGoodDBCCDate = CONVERT(DATETIME, VALUE)FROM # DBCCPAGEWHERE Feld = 'dbi_dbccLastKnownGood';

Dieser wunderbare Codeausschnitt gibt das letzte Mal zurück, als eine erfolgreiche DBCC CHECKDB für die Master-Datenbank ausgeführt wurde. Whoa … wie süß ist das? Wenn Sie einen Server feststellen, auf dem der CHECKDB-Job so fehlgeschlagen ist, dass der Job nur fehlgeschlagene Einträge im Jobverlauf enthält, können Sie jetzt herausfinden, wie lange es her ist, seit er zuletzt erfolgreich ausgeführt wurde.

Der „Trick“, um dies zu erreichen, besteht darin, den Befehl DBCC als Zeichenfolge zu kapseln und ihn mit der Funktion EXECUTE () aufzurufen. Dies wird als Teil einer INSERT INTO / EXECUTE-Anweisung verwendet, sodass die Ergebnisse der DBCC-SEITE in eine Tabelle eingefügt werden (in diesem Fall wird eine temporäre Tabelle verwendet, obwohl auch eine Tabellenvariable oder eine permanente Tabelle verwendet werden kann). Es gibt drei einfache Schritte zu diesem Prozess:

  1. Erstellen Sie eine Tabelle (permanent / temporär) oder Tabellenvariable, um die Ausgabe zu speichern.
  2. Fügen Sie die Ergebnisse der DBCC PAGE-Anweisung mit INSERT INTO / EXECUTE in diese Tabelle ein.
  3. Wählen Sie die gesuchten Daten aus der Tabelle aus.

Mit einem Cursor können Sie ganz einfach alle Datenbanken in Ihrer Instanz durchsuchen, um zu erfahren, wann sie zuletzt eine erfolgreiche DBCC CHECKDB für sie ausgeführt haben. Im Folgenden wird sp_MSforeachdb (das selbst einen Cursor verwendet, um alle Datenbanken zu durchlaufen) verwendet, um genau dies zu tun:

Quellcode
 WENN OBJECT_ID('tempdb.dbo.#DBCCPAGE') IST NICHT NULL DROP TABLE #DBCCPAGE;IF OBJECT_ID('tempdb.dbo.#CheckDBDates') IST NICHT NULL DROP TABLE #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;

Und hier haben wir jede Datenbank in Ihrer Instanz und das Datum, an dem DBCC CHECKDB zuletzt erfolgreich ausgeführt wurde – zumindest für die Datenbanken, die sp_MSforeachdb nicht übersprungen hat (weitere Informationen dazu finden Sie unter https://www.mssqltips.com/sqlservertip/2201/making-a-more-reliable-and-flexible-spmsforeachdb/).

Zusammenfassend können wir durch die Verwendung der Option „WITH TABLERESULTS“ von DBCC Prozesse automatisieren, die die DBCC-SEITE verwenden, anstatt manuelle Eingriffe zu benötigen, um sich durch diese zu arbeiten.

In den nächsten Raten werden wir uns andere Verwendungsmöglichkeiten von „WITH TABLERESULTS“ zur Automatisierung der DBCC-Ausgabe ansehen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.