automatisering af DBCC-side

helt tilbage i 2006 dokumenterede Paul Randal DBCC-side på sin Microsoft-blog på https://blogs.msdn.com/b/sqlserverstorageengine/archive/2006/06/10/625659.aspx. I sit indlæg vil du bemærke, at for at returnere output fra DBCC-siden til skærmen, skal du først aktivere trace flag 3604. Ovenstående blogindlæg viser et par eksempler på resultaterne og bruger dem til yderligere handlinger. Desværre kræver denne metode manuel indgriben for at få de nødvendige data fra siden for at kunne arbejde videre med det.

du ved, det ville helt sikkert være rart, hvis den manuelle indgriben kunne fjernes og automatisere den opgave, du leder efter, fuldstændigt. Dette blogindlæg vil vise dig, hvordan dette kan gøres, og det vil give et par eksempler på at gøre det.

i mit sidste blogindlæg introducerede jeg en valgfri indstilling til flere DBCC-kommandoer: med TABLERESULTS. Dette returnerer output i tabelformat på en måde, der gør det muligt at forbruge output. Som det viser sig, fungerer denne valgfrie indstilling også med DBCC-siden. Du kan se dette ved at undersøge siden databaseoplysninger (side 9) i masterdatabasen:

kildekode
DBCC side ('master', 1, 9, 3) med TABLERESULTATER;

denne erklæring, som kan køres uden sporingsflagget, returnerer dataene på siden i 4 kolonner: ParentObject, Object, Field og VALUE. Som det viser sig, har denne særlige side i hver database en masse interessante oplysninger om den. Lad os automatisere at gribe et bestemt stykke information ud af denne side:

kildekode
hvis OBJECT_ID ('tempdb.dbo.#DBCCPAGE') er ikke NULL DROP TABLE #DBCCPAGE;Opret tabel #DBCCPAGE ( ParentObject VARCHAR(255), Varchar(255), felt Varchar(255), VARCHAR(255));indsæt i #DBCCPAGEUDFØRELSE ('DBCC-side ("master", 1, 9, 3) med TABLERESULTATER;'); vælg LastGoodDBCCDate = konverter(DATETIME, værdi)fra # DBCCPAGEHVOR field = 'DBI_DBCCLASTKENDT godt';

denne vidunderlige kodestykke returnerer sidste gang en vellykket DBCC CHECKDB blev kørt mod masterdatabasen. Hvor sødt er det? Når du opdager en server, hvor CHECKDB-jobbet har svigtet til det punkt, at jobbet kun har mislykkede poster i jobhistorikken, kan du nu finde ud af, hvor længe det er siden det sidst blev kørt med succes.

“tricket” til at gøre dette arbejde er at indkapsle DBCC-kommandoen som en streng og kalde den med funktionen udfør (). Dette bruges som en del af en indsæt i / udfør sætning, så resultaterne fra DBCC-siden indsættes i en tabel (i dette tilfælde bruges en midlertidig tabel, selvom en tabelvariabel eller permanent tabel også kan bruges). Der er tre enkle trin til denne proces:

  1. Opret en tabel (permanent / midlertidig) eller tabelvariabel for at holde output.
  2. Indsæt resultaterne af DBCC-sidesætningen i denne tabel ved hjælp af Indsæt i / udfør.
  3. Vælg de data, du leder efter, fra tabellen.

ved at bruge en markør kan du nemt spinde gennem alle databaserne på din forekomst for at få, når de sidst havde en vellykket DBCC CHECKDB køre imod dem. Følgende udnytter sp_MSforeachdb (som selv bruger en markør til at spinde gennem alle databaserne) for at gøre netop dette:

kildekode
hvis OBJECT_ID ('tempdb.dbo.#DBCCPAGE') er ikke NULL DROP TABLE #DBCCPAGE;hvis OBJECT_ID('tempdb.dbo.# CheckDBDates') er ikke 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;

og her har vi hver database på din forekomst, og den dato, hvor DBCC CHECKDB sidst blev kørt med succes imod det – ja, i det mindste for de databaser, som sp_MSforeachdb ikke sprang over (se https://www.mssqltips.com/sqlservertip/2201/making-a-more-reliable-and-flexible-spmsforeachdb/ for mere information om dette).

sammenfattende kan vi ved at bruge “med TABLERESULTS” – muligheden for DBCC automatisere processer, der bruger DBCC-siden, i stedet for at have brug for manuel indgriben for at arbejde dig igennem dette.

i de næste par rater ser vi på andre anvendelser af at bruge “med TABLERESULTATER” til at automatisere DBCC-output.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.